Сортировка списка объектов по свойствам в Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы отсортировать список объектов типа Person по полю age в Java 8, применяется Comparator:

Java
Скопировать код
List<Person> people = ...;
people.sort(Comparator.comparing(Person::getAge));

Для обратной сортировки следует использовать следующий код:

Java
Скопировать код
people.sort(Comparator.comparing(Person::getAge).reversed());
Кинга Идем в IT: пошаговый план для смены профессии

Comparator: универсальный инструмент сортировки

Comparator позволяет установить правила сортировки объектов. Одно из его преимуществ – возможность сортировки по нескольким параметрам с помощью thenComparing:

Java
Скопировать код
people.sort(Comparator.comparing(Person::getLastName).thenComparing(Person::getFirstName));

В Java 8 появилась функция обработки null значений через Comparator.nullsFirst:

Java
Скопировать код
people.sort(Comparator.comparing(Person::getAge, Comparator.nullsFirst(Integer::compareTo)));

Чтобы ускорить сортировку, можно применить специализированные методы для примитивов:

Java
Скопировать код
people.sort(Comparator.comparingInt(Person::getAge));

Не забывайте контролировать типы объектов, чтобы избежать ошибки ClassCastException.

Пользовательский Comparator: применение индивидуальных правил сортировки

Вы можете задать собственные правила сортировки, переопределив метод compare:

Java
Скопировать код
people.sort(new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getBirthday().compareTo(p2.getBirthday());
    }
});

Совет: храните часто используемые экземпляры Comparator в виде static final переменных.

Лямбда-выражения для упрощения

С лямбда-выражениями код становится более социализированным и современным:

Java
Скопировать код
people.sort((p1, p2) -> p1.getAge() – p2.getAge());

Визуализация

Сортировка объектов напоминает расстановку книг:

До: [📚, 📔, 📘, 📙, 📕]
После: [📕, 📔, 📘, 📙, 📚]

Сравнение свойств объектов аналогично сравнению размеров книг:

| Объект | Свойство |
| 📚     | Высокая  |
| 📔     | Низкая   |
| 📘     | Средняя  |
| 📙     | Выше     |
| 📕     | Ниже     |

Сортировка для профессионалов

Естественный порядок: встроенные сортировки

Реализация интерфейса Comparable позволяет использовать естественный порядок объектов:

Java
Скопировать код
class Person implements Comparable<Person> {
    // Реализация класса...
    
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

Collections.sort(people);

Üslожненная многокритериальная сортировка

Вы можете создать различные компараторы для сортировки по множественным критериям:

Java
Скопировать код
Comparator<Person> byHeight = Comparator.comparing(Person::getHeight);
Comparator<Person> byWeight = Comparator.comparing(Person::getWeight);

people.sort(byHeight.thenComparing(byWeight));

Использование потоков в Java с методом sorted

Можно использовать Comparator в потоках данных:

Java
Скопировать код
List<Person> sortedList = people.stream()
    .sorted(Comparator.comparing(Person::getAge))
    .collect(Collectors.toList());

Как избежать популярных ошибок при сортировке

Особое внимание уделяйте типизации объектов, обработке null значений и оптимизации с помощью специализированных методов.

Полезные материалы

  1. Comparator (Java Platform SE 8) — документация Java по Comparator.
  2. Lambda Expressions (The Java Tutorials) — гид по лямбда-выражениям.
  3. Stream (Java Platform SE 8) — информация о потоках в Java.
  4. Java Programming Tutorial – 85 – Sorting Lists of Objects — видеоурок про сортировку объектов.
  5. [Java 8 Lambdas [Book]](https://www.oreilly.com/library/view/java-8-lambdas/9781449370831/) — книга о лямбда-выражениях в Java 8.
  6. Method References in Java 8 — статья о ссылках на методы в Java 8.