W3docs

Как отсортировать 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 case

Comparator также поддерживает композицию. Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()) сортирует сначала по длине, а при совпадении — в алфавитном порядке. Для объектов Comparator.comparing(Person::lastName) выполняет сортировку по любому полю.

ПодходКогда использовать
Collections.sort(list)Естественный порядок, устаревшие кодовые базы
list.sort(Comparator)Современный, читаемый, пользовательские порядки
Comparator.reverseOrder()Обратный естественный порядок
Comparator.comparing(...)Сортировка объектов по полю

Осторожно с порядком строк по умолчанию

Естественный порядок String основан на кодовых точках Unicode, поэтому каждая заглавная буква (AZ) стоит перед каждой строчной буквой (az). "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.

Исполняемый пример

Этот пример начинается с одного списка, а затем сортирует его копии четырьмя разными способами, чтобы можно было сравнить результаты. Исходный список остаётся нетронутым.

java— editable, runs on the server

Что следует вынести из запуска:

  • Естественный порядок выводит [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] в порядке вставки, доказывая, что каждая сортировка выполнялась на копии, а не на источнике.

Практика

Практика
Какой вызов сортирует ArrayList строк в порядке убывания?
Какой вызов сортирует ArrayList строк в порядке убывания?
Was this page helpful?