Коллекции Java sort()

Изучите использование метода Collections.sort() для сортировки списка объектов на нескольких примерах.

По умолчанию метод sort() сортирует заданный список в порядке возрастания(или в естественном порядке). Мы можем использовать метод Collections.reverseOrder(), который возвращает Comparator, для обратной сортировки.

1. Сортировка в естественном и обратном порядке

 Collections.sort(list); //Сортирует в естественном порядкеCollections.sort(list, Collections.reverseOrder()); //Сортирует в обратном порядке
  1. Приведенный выше метод сортирует указанный список элементов в их естественном порядке.
  2. Все элементы должны реализовывать интерфейс Comparable.
  3. Все элементы должны быть взаимно сопоставимы и не должны вызывать исключение ClassCastException.
  4. Эта сортировка гарантированно стабильна. Это означает, что одинаковые элементы не будут переупорядочены в результате сортировки.
  5. Указанный список должен быть изменяем, но его размер не должен изменяться.
  6. Функция 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 в порядке по умолчанию или в обратном порядке.

Мы также научились использовать компараторы для реализации пользовательской логики сортировки.

Прокрутить вверх