Ответ
Интерфейс Comparator<T> используется для определения альтернативных или внешних правил сортировки, отличных от естественного порядка, заданного Comparable.
Основные сценарии использования:
- Класс не реализует
Comparable, и вы не можете или не хотите его изменять (например, класс из сторонней библиотеки). - Требуется несколько различных способов сортировки одних и тех же объектов (по имени, по дате, по зарплате).
- Нужна сортировка, обратная естественному порядку (descending order).
- Сложная составная сортировка (сначала по одному полю, затем по другому).
Примеры использования:
class Person {
private String name;
private int age;
// Геттеры, сеттеры...
}
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 30)
);
// 1. Сортировка по возрасту (создание Comparator через лямбду)
people.sort(Comparator.comparingInt(Person::getAge));
// 2. Сортировка по имени в обратном порядке
people.sort(Comparator.comparing(Person::getName).reversed());
// 3. Составная сортировка: сначала по возрасту, затем по имени
people.sort(Comparator
.comparingInt(Person::getAge)
.thenComparing(Person::getName)
);
// 4. Создание именованного компаратора для повторного использования
Comparator<Person> byNameLength = (p1, p2) ->
Integer.compare(p1.getName().length(), p2.getName().length());
people.sort(byNameLength);
Comparator обеспечивает гибкость, отделяя логику сравнения от класса объекта.