Comparable и comparator java

Comparable и comparator java

Comparable

Comparable interface is used when we want to compare objects using one of their property. It is considered a natural sorting of objects. Consider a list of employees and we want them to be sorted by name as a default sorting order. The comparable interface has compareTo() method which the target class has to implement.

Now a collection of the above objects can be sorted by name using Collections.sort() method.

Comparator

Comparator interface provides a compare() method to compare two objects of the same class. Here it provides the flexibility as we can create n number of comparators for each property of an object which we want to compare. Consider the following examples:

Example

In this example, we are showcasing the usage of comparable as well as comparator interfaces to sort a list of employees based on their names, id, and age respectively.

Два новых интерфейса java.lang.Comparable и java.util.Comparator были добавлены в версии Java 5. Использование данных интерфейcов в своих приложениях позволяет упорядочивать (сортировать) данные.

Интерфейс Comparable

В интерфейсе Comparable объявлен только один метод compareTo (Object obj), предназначенный для упорядочивания объектов класса. Данный метод удобно использовать для сортировки списков или массивов объектов.

Метод compareTo (Object obj) сравнивает вызываемый объект с obj. В отличие от метода equals, который возвращает true или false, compareTo возвращает:

  • 0, если значения равны;
  • Отрицательное значение (обычно -1), если вызываемый объект меньше obj;
  • Положительное значение (обычно +1), если вызываемый объект больше obj.

Если типы объектов не совместимы при сравнении, то compareTo (Object obj) может вызвать исключение ClassCastException. Необходимо помнить, что аргумент метода compareTo имеет тип сравниваемого объекта класса.

Читайте также:  Canon i sensys lbp7018c заправка картриджа

Обычные классы Byte, Short, Integer, Long, Double, Float, Character, String уже реализуют интерфейс Comparable.

Пример реализации интерфейса Comparable

Результат выполнения программы:

В примере значения сортируются сначала по полю str (по алфавиту), а затем по num в методе compareTo. Это хорошо видно по двум строкам с одинаковыми значения str и различными num. Чтобы изменить порядок сортировки значения str (в обратном порядке), необходимо внести небольшие изменения в метод compareTo.

Интерфейс Comparator : compare, compareTo

В интерфейсе Comparator объявлен метод compare (Object obj1, Object obj2), который позволяет сравнивать между собой два объекта. На выходе метод возвращает значение 0, если объекты равны, положительное значение или отрицательное значение, если объекты не тождественны.

Метод может вызвать исключение ClassCastException, если типы объектов не совместимы при сравнении. Простой пример реализации интерфейса Comparator:

Результат выполнения программы:

Усложним пример, и реализуем несколько видов сортировки. Для этого создадим класс Product с полями name, price и quantity.

Создадим два класса (SortedByName, SortedByPrice), реализующих интерфейс Comparator для сортировки объектов по названию и по цене :

Пример использования Arrays.sort :

Результат выполнения программы:

Для сортировки объектов были реализованы два независимых компаратора по наименованию и по цене (SortedByName и SortedByPrice). Сортировка выполняется с помощью класса Arrays, у которого есть метод sort. Данный метод в качестве второго аргумента принимает тип компаратора.

Можно использовать также метод sort класса Collections, который в качестве первого входного аргумента принимает список объектов:

Отличие интерфейсов Comparator и Comparable

Интерфейс Comparable используется только для сравнения объектов класса, в котором данный интерфейс реализован. Т.е. interface Comparable определяет логику сравнения объекта определенного ссылочного типа внутри своей реализации (по правилам разработчика).

Читайте также:  Assassins creed origins сюжет современности

Comparator представляет отдельную реализацию и ее можно использовать многократно и с различными классами. Т.е. interface Comparator позволяет создавать объекты, которые будут управлять процессом сравнения (например при сортировках).

Привет! Это статья про интерфейсы Comparable и Comparator. Для понимания материала Вам, естественно, нужно знать что такое интерфейс.

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

Но для того, чтобы что-то отсортировать, нам нужно сравнивать объекты по каким-то правилам. Тут, казалось бы, все просто — мы можем сортировать числа, да и в сортировке по алфавиту нет ничего сложного. Да, с такими данными все легко. Но как нам сравнить два объекта класса Car? По цене, пробегу, лошадиным силам или дате выпуска? А может по количеству владельцев?

Если у нас есть два объекта класса Cat — как сравнить их? По кличке? По породе? По возрасту?

Как видите, не всегда очевидно как именно можно сравнить два объекта. Но не беда — мы сами можем прописать эти правила. Именно для этого мы можем реализовать интерфейсы Comparable и Comparator.

  • Кроме того, некоторые встроенные возможности в Java можно использовать только, если Ваш класс реализует Comparable или Comparator.

Интерфейс Comparable

С английского "Comparable" переводится как "сравнимый". Имплементируя этот интерфейс мы как бы говорим "Эй, теперь объекты этого класса можно сравнивать между собой! И я знаю, как это сделать!" А до этого было нельзя 🙂

Так как выглядит интерфейс Comparable? Очень просто — в нем находится всего один метод:

Ссылка на основную публикацию
Adblock detector