Интерфейс Comparator

В прошлом уроке мы рассмотрели как сравнивать объекты классов, реализующих интерфейс Comparable

Если класс по какой-то причине не может реализовать интерфейс Comparable, или же просто нужен другой вариант сравнения, используется интерфейс Comparator.

Интерфейс содержит метод int compare(T o1, T o2), который должен быть реализован классом, реализующим компаратор.

Метод compare возвращает числовое значение - если оно отрицательное, то объект o1 предшествует объекту o2, иначе - наоборот. А если метод возвращает ноль, то объекты равны.

Для применения интерфейса нам вначале надо создать класс компаратора, который реализует этот параметризованный интерфейс.

Рассмотрим пример использования интерфейса Comparator:

import java.util.Comparator;

public class PersonComparator implements Comparator<Person> {
     @Override
     public int compare(Person o1, Person o2) {
         return o1.getLastName().compareTo(o2.getLastName());
     }
}
import java.util.SortedSet;
import java.util.TreeSet;

public class PersonComparatorDemo {
    public static void main(String[] args) {
        PersonComparator personComparator = new PersonComparator();
        SortedSet<Person> set = new TreeSet<>(personComparator);
        set.add(new Person("Саша", "Иванов", 36));
        set.add(new Person("Маша", "Петрова", 23));
        set.add(new Person("Даша", "Сидорова", 34));
        set.add(new Person("Вася", "Иванов", 25));
        //Обратите внимание - было добавлено 4 элемента, но распечатано 3
        set.forEach(System.out::println);
    }
}

Тоже самое перепишем с использованием метода comparing() интерфейса Comparator:

import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;

public class PersonComparingDemo {
    public static void main(String[] args) {
        Comparator<Person> personComparator =
                Comparator.comparing(Person::getLastName).thenComparing(Person::getAge);
        SortedSet<Person> set = new TreeSet<>(personComparator);
        set.add(new Person("Саша", "Иванов", 36));
        set.add(new Person("Маша", "Петрова", 23));
        set.add(new Person("Даша", "Сидорова", 34));
        set.add(new Person("Вася", "Иванов", 25));
        set.forEach(System.out::println);
    }
}
Read also:
Comments