В этой статье, мы увидим несколько примеров того, как отсортировать список в Java 8-х.
1. сортируется в алфавитном порядке список строк
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]
Для того , чтобы выделить дисплей Comparator.naturalOrder()
(возвращаемый в случае алфавитного компараторе) и String.CASE_INSENSITIVE_ORDER
(без учета регистра возврата компаратора) различие, мы используем «London» в нижнем регистре «L».
В основном, Java 7
мы используем Collections.sort()
метод принимает List
параметр, окончательное возвращение Comparator
, но в Java 8
новом List.sort()
методе, который принимает Comparator
параметры.
2. отсортировать список целых чисел
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]
3. Нажмите на поле строки для сортировки списка
Предположим , у нас есть Movie
класс, хотите , чтобы отсортировать список по названию. Мы можем использовать Comparator.comparing()
и передавать для сортировки поле - в настоящем варианте осуществления title
.
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'}
Вы , возможно, заметили , что мы не прошли компаратор (компаратор), но список отсортирован правильно, потому что название извлекается поле типа String, и строка реализовать Comparable
интерфейс.
Если вы посмотрите Comparator.comparison()
достичь, вы увидите кнопку для вызова его извлечение compareTo
метода.
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
4. Список Дважды поле отсортировано по
Аналогичным образом, она может быть использована Comparator.comparingDouble()
для сравнения double
значений. В нашем примере, мы хотим , чтобы отсортировать список по рейтингу фильма от высокой к низкой.
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);
Мы используем функцию инверсии ( reversed
) для обратных по умолчанию от низкого до высокого естественного порядка, Comparator.comparingDouble()
лежащее в основе использование Double.compare()
для достижения. Если вам нужно сравнить int
или long
, каждый может быть использован comparisonInt()
и comparisonLong()
.
5. Использование пользовательского компаратор для сортировки списка
В предыдущем примере, ничего не указано Comparator
, это не является необходимым. Теперь давайте посмотрим на пользовательский Comparator
пример.
Наш Movie
класс имеет новое поле - «избранный». Используя третий набор аргументов конструктора. В нашем примере, мы хотим , чтобы отсортировать список , чтобы отобразить фильм снимался в верхней части списка.
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}
Конечно, мы можем использовать lambda
выражение вместо анонимного класса ( Anonymous class
) следующим образом :
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()
.
6. Использование компараторе цепи для сортировки списка
Последний пример, мы хотим, чтобы фильм снимался на вершине, а затем сортируются по рейтингу.
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}
Как вы можете видеть, мы первые в зависимости от того снимался сортируют, затем сортировка по рейтингу - оба из которых были полностью изменить вид, потому что мы хотим, чтобы высокий балл и снялся в передней части.
Добро пожаловать на номер общественности относятся: Gangster вне горшка (количество общественного сознания) Ежедневно Нажимные переводные статьи из-за рубежа, чтобы помочь каждой стране технические специалисты
Оригинальная ссылка: https: //dzone.com/articles/java-8-comparator-how-to-sort-a-list
作者: Марио Pio Джоиоза https://dzone.com/users/1354529/mariocidio.html
Переводчик: Steephan