>  기사  >  Java  >  Java8 비교기 - 목록 정렬 방법에 대한 자세한 설명

Java8 비교기 - 목록 정렬 방법에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-18 11:11:413148검색

Java8 비교기 - 목록 정렬 방법에 대한 자세한 설명

이 기사에서는 Java 8에서 목록을 정렬하는 방법에 대한 몇 가지 지침을 볼 수 있습니다. 예.

알파벳순으로 정렬StringList

List<String> cities = Arrays.asList(
       "Milan",
       "london",
       "San Francisco",
       "Tokyo",
       "New Delhi"
);
System.out.println(cities);
//[Milan, london, San Francisco, Tokyo, New Delhi]
cities.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println(cities);
//[london, Milan, New Delhi, San Francisco, Tokyo]
cities.sort(Comparator.naturalOrder());
System.out.println(cities);
//[Milan, New Delhi, San Francisco, Tokyo, london]

런던의 "L"은 더 잘 강조하기 위해 소문자를 사용합니다. Comparator.naturalOrder()(대문자 정렬을 먼저 반환합니다. 문자 비교기의 차이점 ) 및 String.CASE_INSENSITIVE_ORDER(대소문자를 구분하지 않고 반환하는 비교기).

기본적으로 Java 7에는 List와 Comparator를 허용하는 Collection.sort()가 있습니다. Java 8에는 Comparator를 허용하는 새로운 List.sort()가 있습니다.

정수

List<Integer> numbers = Arrays.asList(6, 2, 1, 4, 9);
System.out.println(numbers); //[6, 2, 1, 4, 9]
numbers.sort(Comparator.naturalOrder());
System.out.println(numbers); //[1, 2, 4, 6, 9]

문자열 필드로 목록 정렬

영화 클래스가 있고 제목별로 "를 원한다고 가정합니다. " "목록을 정렬합니다. Comparator.comparing() 을 사용하여 제목을 정렬하는 데 사용되는 필드를 추출하는 함수 를 전달할 수 있습니다.

List<Movie> movies = Arrays.asList(
        new Movie("Lord of the rings"),
        new Movie("Back to the future"),
        new Movie("Carlito&#39;s way"),
        new Movie("Pulp fiction"));
movies.sort(Comparator.comparing(Movie::getTitle));
movies.forEach(System.out::println);

출력:

Movie{title=&#39;Back to the future&#39;}
Movie{title=&#39;Carlito&#39;s way&#39;}
Movie{title=&#39;Lord of the rings&#39;}
Movie{title=&#39;Pulp fiction&#39;}

아마도 우리가 어떤 비교기를 전달하지 않고 있지만 목록이 올바르게 정렬되어 있음을 알 수 있을 것입니다. 이는 추출된 필드인 제목이 문자열이고 문자열이 Comparable 인터페이스 를 구현하기 때문입니다. Comparator.comparing() 구현을 살펴보면 추출된 키에 대해 CompareTo를 호출하는 것을 볼 수 있습니다.

return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));

이중 필드로 목록 정렬

비슷한 방식으로 Comparator.comparingDouble()을 사용하여 이중 값을 비교할 수 있습니다. 이 예에서는 영화 목록을 최고 등급에서 최저 등급 순으로 정렬하려고 합니다.

List<Movie> movies = Arrays.asList(
        new Movie("Lord of the rings", 8.8),
        new Movie("Back to the future", 8.5),
        new Movie("Carlito&#39;s way", 7.9),
        new Movie("Pulp fiction", 8.9));
movies.sort(Comparator.comparingDouble(Movie::getRating)
                      .reversed());
movies.forEach(System.out::println);

기본 자연 순서를 가장 낮은 순서에서 가장 높은 순서로 바꾸기 위해 비교기의 반전 기능을 사용합니다. Comparator.comparingDouble()은 내부적으로 Double.compare()를 사용합니다.

int 또는 long을 비교해야 하는 경우, CompareInt() 및 CompariingLong()을 각각 사용할 수 있습니다.

사용자 정의 비교기를 사용하여 목록 정렬

이전 예에서는 비교기가 필요하지 않아 비교기를 지정하지 않았지만 자체 비교기를 정의한 예를 살펴보겠습니다. Movie 클래스에는 세 번째 생성자 매개변수를 사용하여 설정된 "starred"라는 새 필드가 있습니다. 이 예에서는 별표가 표시된 영화가 목록의 맨 위에 오도록 목록을 정렬하려고 합니다.

List<Movie> movies = Arrays.asList(
        new Movie("Lord of the rings", 8.8, true),
        new Movie("Back to the future", 8.5, false),
        new Movie("Carlito&#39;s way", 7.9, true),
        new Movie("Pulp fiction", 8.9, false));
movies.sort(new Comparator<Movie>() {
    @Override
    public int compare(Movie m1, Movie m2) {
        if(m1.getStarred() == m2.getStarred()){
            return 0;
        }
        return m1.getStarred() ? -1 : 1;
     }
});
movies.forEach(System.out::println);

결과는 다음과 같습니다:

Movie{starred=true, title=&#39;Lord of the rings&#39;, rating=8.8}
Movie{starred=true, title=&#39;Carlito&#39;s way&#39;, rating=7.9}
Movie{starred=false, title=&#39;Back to the future&#39;, rating=8.5}
Movie{starred=false, title=&#39;Pulp fiction&#39;, rating=8.9}

물론 익명 클래스 대신 다음과 같은 람다 표현식을 사용할 수 있습니다.

movies.sort((m1, m2) -> {
    if(m1.getStarred() == m2.getStarred()){
        return 0;
    }
    return m1.getStarred() ? -1 : 1;
});

Comparator.comparing() 다시:

movies.sort(Comparator.comparing(Movie::getStarred, (star1, star2) -> {
    if(star1 == star2){
         return 0;
    }
    return star1 ? -1 : 1;
}));

최신 예에서 Comparator.comparing()은 첫 번째 인수를 정렬에 사용되는 키를 추출하는 함수로 취하고 Comparator를 두 번째 인수로 사용합니다. Comparator는 비교를 위해 추출된 키를 사용합니다. star1과 star2는 각각 m1.getStarred() 및 m2.getStarred()를 나타내는 부울 값입니다.

비교 체인을 사용하여 목록 정렬

마지막 예에서는 별표가 표시된 영화를 상위에 올린 다음 평점을 기준으로 정렬합니다.

List<Movie> movies = Arrays.asList(
        new Movie("Lord of the rings", 8.8, true),
        new Movie("Back to the future", 8.5, false),
        new Movie("Carlito&#39;s way", 7.9, true),
        new Movie("Pulp fiction", 8.9, false));
movies.sort(Comparator.comparing(Movie::getStarred)
                      .reversed()
                      .thenComparing(Comparator.comparing(Movie::getRating)
                      .reversed())
);
movies.forEach(System.out::println);

출력은 다음과 같습니다.

Movie{starred=true, title=&#39;Lord of the rings&#39;, rating=8.8}
Movie{starred=true, title=&#39;Carlito&#39;s way&#39;, rating=7.9}
Movie{starred=false, title=&#39;Pulp fiction&#39;, rating=8.9}
Movie{starred=false, title=&#39;Back to the future&#39;, rating=8.5}

보시다시피 우리는 먼저 별표를 기준으로 정렬한 다음 등급을 기준으로 정렬합니다. 가장 높은 값과 진정한 첫 번째 값을 원하기 때문에 둘 다 반대입니다.

위 내용은 Java8 비교기 - 목록 정렬 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.