← Назад к вопросам

Как сортировать коллекцию List

1.0 Junior🔥 201 комментариев
#Коллекции

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Как сортировать коллекцию List

Сортировка элементов списка — одна из самых частых операций при работе с коллекциями в Java. Существует несколько способов для достижения этого результата, каждый с собственными преимуществами и сценариями применения.

Основные методы сортировки List

1. Collections.sort() — Классический подход

Это самый простой и исторически первый способ сортировки. Метод Collections.sort() встроен в Java и работает со всеми объектами, реализующими интерфейс Comparable:

List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
Collections.sort(numbers);
System.out.println(numbers); // [1, 2, 5, 8, 9]

Для сортировки в обратном порядке используй Collections.reverseOrder():

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Collections.sort(names, Collections.reverseOrder());
System.out.println(names); // [Charlie, Bob, Alice]

2. List.sort() — Java 8+

Native метод на самом списке, который работает быстрее благодаря оптимизациям:

List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
numbers.sort(Comparator.naturalOrder());
System.out.println(numbers); // [1, 2, 5, 8, 9]

Для сортировки по убыванию:

numbers.sort(Comparator.reverseOrder());
System.out.println(numbers); // [9, 8, 5, 2, 1]

3. Stream.sorted() — Функциональный подход

Этот способ идеален для преобразований и фильтрации данных:

List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 9);
List<Integer> sorted = numbers.stream()
    .sorted()
    .collect(Collectors.toList());
System.out.println(sorted); // [1, 2, 5, 8, 9]

Сортировка пользовательских объектов

Реализация Comparable

Класс должен имплементировать интерфейс Comparable<T>:

class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25),
    new Person("Charlie", 35)
);
Collections.sort(people);
// Результат отсортирован по возрасту: Bob (25), Alice (30), Charlie (35)

Использование Comparator

Этот подход более гибкий и позволяет множественные сортировки без изменения класса:

// Сортировка по имени
numbers.sort(Comparator.comparing(Person::getName));

// Сортировка по возрасту в обратном порядке
numbers.sort(Comparator.comparingInt(Person::getAge).reversed());

// Сортировка по нескольким критериям
numbers.sort(Comparator
    .comparingInt(Person::getAge)
    .thenComparing(Person::getName));

Производительность

Collections.sort() и List.sort() используют Timsort — гибридный алгоритм (комбинация Merge Sort и Insertion Sort), который обеспечивает O(n log n) в худшем случае и O(n) для частично отсортированных данных.

Stream.sorted() создает новый список, поэтому требует дополнительную память, но полезна при конвейерной обработке данных.

Рекомендации

  • Для простых случаев: используй List.sort() с Comparator — это самый быстрый и современный способ
  • Для объектов с естественным порядком: реализуй Comparable
  • Для сложных сценариев: используй Stream.sorted() с фильтрацией и трансформациями
  • Когда нужна новая коллекция: Stream.sorted() — лучше для функционального стиля
  • Для сортировки по нескольким полям: цепочка Comparator.comparing() и thenComparing()