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

Чтобы понять этот пример, нужно знать следующие темы:

  • Классы и объекты Java

  • ArrayList в Java

Пример: Сортировка ArrayList пользовательских объектов по свойству

import java.util.*;

public class CustomObject {

    private String customProperty;

    public CustomObject(String property) {
        this.customProperty = property;
    }

    public String getCustomProperty() {
        return this.customProperty;
    }

    public static void main(String[] args) {

        ArrayList<Customobject> list = new ArrayList<>();
        list.add(new CustomObject("Z"));
        list.add(new CustomObject("A"));
        list.add(new CustomObject("B"));
        list.add(new CustomObject("X"));
        list.add(new CustomObject("Aa"));

        list.sort((o1, o2) -> o1.getCustomProperty().compareTo(o2.getCustomProperty()));

        for (CustomObject obj : list) {
            System.out.println(obj.getCustomProperty());
        }
    }
}

Вывод:

A
Aa
B
X
Z

В программе выше мы определили класс CustomObject со свойством типа String — customProperty.

Мы также добавили конструктор, который инициализирует свойство, и геттер getCustomProperty(), который возвращает customProperty.

В методе main() мы создали список пользовательских объектов list, инициализированный 5 объектами.

Чтобы отсортировать список по заданному свойству, мы используем метод sort() списка. Метод sort() принимает список для сортировки (итоговый отсортированный список — тот же самый) и comparator.

В нашем случае компаратор — это лямбда, которая:

  • принимает два объекта из списка o1 и o2,

  • сравнивает свойство customProperty двух объектов с помощью метода compareTo(),

  • и наконец возвращает положительное число, если свойство o1 больше, чем у o2, отрицательное, если свойство o1 меньше, чем у o2, и ноль, если они равны.

На основе этого list сортируется от наименьшего свойства к наибольшему и сохраняется обратно в list.

Примечание

Для int мы используем Comparator.comparingInt(CustomObject::getCustomProperty) для сортировки ArrayList по int-свойству.