Пример сортировки с помощью Java Comparable и Comparator

Пример сортировки с помощью Java Comparable и Comparator

Java предоставляет встроенные методы для сортировки массива примитивных типов, объектов, массивов и списков. В этой статье мы разберем различные способы сортировки используя java.lang.Comparable и java.util.Comparator.

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

В результате получим следующий вывод в консоль:

Так, а теперь давайте попробуем отсортировать массив объектов нашего собственного класса:

Ниже показан фрагмент кода для сортировки массива объектов Employee:

Теперь запустим программу и получим ошибку:

В чем причина? Дело в том, что если пользовательский класс в Java хочет использовать встроенные методы сортировки классов Arrays или Collections, то он должен реализовать интерфейс Comparable. Этот интерфейс предоставляет метод  compareTo(T obj), который используется методами сортировки. Вы можете убедиться в этом сами, просто посмотрев на реализацию классов String или Date.

Для того, чтобы избежать этой ошибки мы должны переопределить метод compareTo(T obj) таким образом, чтобы он возвращал отрицательное число, ноль или положительное целое число, если «этот» объект меньше, равен или больше объекта, переданного в качестве аргумента.

После реализации интерфейса Comparable класс Employee изменится следующим образом:

Теперь, когда мы запустим этот код, то получим в консоль вывод отсортированного массива в читабельном виде:

Как видно из вывода в консоль, массив объектов Employee отсортирован по id в порядке возрастания.

Но в большинстве реальных проектов нужно несколько вариантов сортировки с различными параметрами, а не только id. Например можно отсортировать служащих по уровню заработной платы или по возрасту.

С помощью метода Comparable.compareTo(Object o) можно отсортировать объекты только по одному полю. Вот для таких вот ситуаций лучше всего использовать компаратор.

Метод компаратора compare(Object o1, Object o2) принимает два объекта в качестве аргумента и должен быть реализован таким образом, чтобы возвращать отрицательное число — если первый аргумент меньше второго, ноль — если они равны и положительное число, если первый аргумент больше, чем второй.

Оба интерфейса Comparable и Comparator использует дженерики.

Давайте посмотрим на реализацию компаратора в классе Employee:

Все представленные выше реализации интерфейса Comparator являются анонимными классами.

Мы можем использовать эти компараторы передавая их в качестве аргумента для сортировки массивов или коллекций.

Итак, теперь мы можем сортировать любой массив или список объектов. Для этого мы должны реализовать Comparator под каждое конкретное поле.

Мы также можем создать отдельный класс, который реализует интерфейс компаратора и затем использовать его.

Ниже приведена окончательная версия с реализованным интерфейсом Comparable и Comparator:

А теперь усложним наш пример и вынесем нашу сортировку в отдельный класс и добавим еще одно условие сортировки:

Ниже представлен отдельный класс, который реализует интерфейс Comparator и будет сравнивать два объекта по id, и если они одинаковы, то по имени:

Вот тестовый класс, где мы используем различные способы сортировки объектов в Java:

Сегодня мы узнали, что java.lang.Comparable и java.util.Comparator — это мощные интерфейсы для  сортировки объектов в Java.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *