Java8 비교기 - 목록 정렬 방법에 대한 자세한 설명
이 기사에서는 Java 8에서 목록을 정렬하는 방법에 대한 몇 가지 지침을 볼 수 있습니다. 예.
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's way"), new Movie("Pulp fiction")); movies.sort(Comparator.comparing(Movie::getTitle)); movies.forEach(System.out::println);
출력:
Movie{title='Back to the future'} Movie{title='Carlito's way'} Movie{title='Lord of the rings'} Movie{title='Pulp fiction'}
아마도 우리가 어떤 비교기를 전달하지 않고 있지만 목록이 올바르게 정렬되어 있음을 알 수 있을 것입니다. 이는 추출된 필드인 제목이 문자열이고 문자열이 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'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'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='Lord of the rings', rating=8.8} Movie{starred=true, title='Carlito's way', rating=7.9} Movie{starred=false, title='Back to the future', rating=8.5} Movie{starred=false, title='Pulp fiction', 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'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='Lord of the rings', rating=8.8} Movie{starred=true, title='Carlito's way', rating=7.9} Movie{starred=false, title='Pulp fiction', rating=8.9} Movie{starred=false, title='Back to the future', rating=8.5}
보시다시피 우리는 먼저 별표를 기준으로 정렬한 다음 등급을 기준으로 정렬합니다. 가장 높은 값과 진정한 첫 번째 값을 원하기 때문에 둘 다 반대입니다.
위 내용은 Java8 비교기 - 목록 정렬 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!