Как отсортировать ArrayList в Java
Сортировка ArrayList в Java с помощью Collections.sort, List.sort, Comparable и Comparator.
Сортировка ArrayList переупорядочивает его элементы на месте. JDK предоставляет две точки входа — Collections.sort и метод экземпляра List.sort — а также Comparator для любой пользовательской или обратной сортировки. В этой главе показаны идиоматические способы сделать это, объясняется, почему строки со смешанным регистром сортируются именно так, и приводится исполняемый пример для сравнения результатов.
Сортировка в естественном порядке
Для элементов, реализующих Comparable (например, String, Integer или LocalDate), Collections.sort сортирует их в их естественном порядке.
List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
Collections.sort(names);
System.out.println(names); // [Alice, Bob, Charlie]Тот же результат даёт метод экземпляра names.sort(null) — передача null в качестве компаратора означает «использовать естественный порядок». Сортировка происходит на месте, то есть исходный список переупорядочивается, а не копируется.
Сортировка с List.sort и Comparator
Начиная с Java 8, интерфейс List имеет собственный метод sort(Comparator). Он читается более плавно и естественно сочетается с фабричными методами Comparator.
List<String> names = new ArrayList<>(List.of("Charlie", "Bob", "Alice"));
names.sort(Comparator.naturalOrder()); // ascending
names.sort(Comparator.reverseOrder()); // descending
names.sort(String.CASE_INSENSITIVE_ORDER); // ignore letter caseComparator также поддерживает композицию. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) сортирует сначала по длине, а при совпадении — в алфавитном порядке. Для объектов Comparator.comparing(Person::lastName) выполняет сортировку по любому полю.
| Подход | Когда использовать |
|---|---|
Collections.sort(list) | Естественный порядок, устаревшие кодовые базы |
list.sort(Comparator) | Современный, читаемый, пользовательские порядки |
Comparator.reverseOrder() | Обратный естественный порядок |
Comparator.comparing(...) | Сортировка объектов по полю |
Осторожно с порядком строк по умолчанию
Естественный порядок String основан на кодовых точках Unicode, поэтому каждая заглавная буква (A–Z) стоит перед каждой строчной буквой (a–z). "Bob" окажется перед "alice".
List<String> mixed = new ArrayList<>(List.of("alice", "Bob"));
mixed.sort(Comparator.naturalOrder());
System.out.println(mixed); // [Bob, alice]Если нужна сортировка без учёта регистра, используйте String.CASE_INSENSITIVE_ORDER. Для сортировки с учётом языковых правил (диакритические знаки, локальные правила) используйте java.text.Collator.
Исполняемый пример
Этот пример начинается с одного списка, а затем сортирует его копии четырьмя разными способами, чтобы можно было сравнить результаты. Исходный список остаётся нетронутым.
Что следует вынести из запуска:
- Естественный порядок выводит
[Bob, Charlie, alice], потому что кодовые точки заглавных букв стоят перед строчными. Comparator.reverseOrder()переворачивает этот естественный порядок в[alice, Charlie, Bob].String.CASE_INSENSITIVE_ORDERигнорирует регистр и даёт[alice, Bob, Charlie].- Компаратор по длине даёт
[Bob, alice, Charlie]— 3, затем 5, затем 7 букв. - Список
originalпо-прежнему выводит[Charlie, alice, Bob]в порядке вставки, доказывая, что каждая сортировка выполнялась на копии, а не на источнике.