Изучите использование метода Collections.sort() для сортировки списка объектов на нескольких примерах.
По умолчанию метод sort() сортирует заданный список в порядке возрастания(или в естественном порядке). Мы можем использовать метод Collections.reverseOrder(), который возвращает Comparator, для обратной сортировки.
1. Сортировка в естественном и обратном порядке
Collections.sort(list); //Сортирует в естественном порядкеCollections.sort(list, Collections.reverseOrder()); //Сортирует в обратном порядке
- Приведенный выше метод сортирует указанный список элементов в их естественном порядке.
- Все элементы должны реализовывать интерфейс Comparable.
- Все элементы должны быть взаимно сопоставимы и не должны вызывать исключение ClassCastException.
- Эта сортировка гарантированно стабильна. Это означает, что одинаковые элементы не будут переупорядочены в результате сортировки.
- Указанный список должен быть изменяем, но его размер не должен изменяться.
- Функция sort() не возвращает никакого значения.
1.1 Сортировка массива строк
Программа на Java для лексикографической сортировки списка строк(в порядке следования в словаре).
Список<Строка> имена =Arrays.asList("Алекс", "Чарльз", "Брайан", "Дэвид");//Печатные издания - [Алекс, Брайан, Чарльз, Дэвид]Коллекции.сорт(имена);//Печатные издания - [Дэвид, Чарльз, Брайан, Алекс]Коллекции.сортировка(имена, Коллекции.обратныйпорядок());
1.2 Сортировка массива объектов по полю
Нам может потребоваться отсортировать список пользовательских объектов, которые могут иметь собственную логику сортировки. В этом случае реализуйте интерфейс Comparator в пользовательском классе.
Например, объект домена Employee имеет сортировку по умолчанию по полю имени. Проверьте логику сравнения в методе compareTo().
public class Employee implements Comparable<Employee>{private Integer id;private String name;private String email;private LocalDate dateOfBirth;//Getters and Setters@Overridepublic int compareTo(Employee e) {return this.getName().compareTo(e.getName());}}
Программа Nest Java сортирует список объектов Employee по их имени;
ArrayList<Employee> employees = methodReturnsUnsortedList();//Narutal order sortingCollections.sort(employees);//Reverse sortingCollections.sort(employees, Collections.reverseOrder());
2. Пользовательская сортировка с использованием компараторов
Второй параметр в методе sort() принимает экземпляр Comparator.
Мы можем реализовать любую логику сравнения с помощью компараторов, а затем использовать метод sort() для сортировки списка на основе заданной пользовательской логики.
Collections.sort(List, Comparator);
Мы можем создать отдельные экземпляры Comparator для каждого вида сортировки, а затем объединить эти экземпляры для создания эффекта групповой сортировки.
Например, если мы хотим отсортировать список сотрудников по трем полям – id, name и age. В этом случае нам нужно создать 3 экземпляра Comparator.
2.1 Создание пользовательского компаратора
Это общий синтаксис для создания компаратора в Java. В этом случае мы создаем компаратор, который будет сортировать список сотрудников по полю id.
Comparator<Employee> compareById = new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {return o1.getId().compareTo(o2.getId());}};Comparator<Employee> compareByName = new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {return o1.getName().compareTo(o2.getName());}};
Для дальнейшего сокращения синтаксиса можно использовать лямбда-выражение.
//Id ComparatorComparator<Employee> compareById =(Employee o1, Employee o2) ->o1.getId().compareTo( o2.getId() );//Name ComparatorComparator<Employee> compareByName =(Employee o1, Employee o2) ->o1.getName().compareTo( o2.getName() );
2.2 Использование компаратора для сортировки
ArrayList<Employee> employees = getUnsortedEmployeeList();Comparator<Employee> compareById =(Employee o1, Employee o2) -> o1.getId().compareTo( o2.getId() );Collections.sort(employees, compareById);Collections.sort(employees, compareById.reversed());
3. Заключение
В приведенных выше примерах кода мы научились сортировать ArrayList в порядке по умолчанию или в обратном порядке.
Мы также научились использовать компараторы для реализации пользовательской логики сортировки.