Как сделать компаратор java

Обновлено: 07.07.2024

Такие структуры данных, как TreeMap и TreeSet хранят элементы упорядоченными. Параметр и тип сортировки определяется сущностью под названием Comparator.

Интерфейс Comparator содержит 2 ключевых метода:

  • int compare(T o1, T o2)
    Этот метод принимает в качестве параметров 2 объекта одинакового типа. Возвращает 0, если объекты равны. Возвращает положительное значение, если о1 больше о2 и отрицательное значение, если о2 больше о1.
  • boolean equals(Object obj)
    Этот метод проверяет одинаковы ли объекты, который вызывает этот метод и объект, который передаётся в качестве параметра. Если объекты одинаковы – возвращает true, а если нет – false.

Для понимания того, как это работает на практике, рассмотрим пример простого приложения.

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

В это разделе мы изучили основы интерфейса Comaprator и рассмотрели пример простого приложения с его использованием.

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

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

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

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

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

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

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

Предположим, у нас есть массив / массив данных нашего собственного типа класса, содержащий такие поля, как rollno, name, address, DOB и т. Д., И нам нужно отсортировать массив на основе Roll no или name?

Метод 1 : Один очевидный подход — написать нашу собственную функцию sort (), используя один из стандартных алгоритмов. Это решение требует переписывания всего кода сортировки для различных критериев, таких как номер рулона и имя.

Способ 2. Использование интерфейса компаратора. Интерфейс компаратора используется для упорядочения объектов определенного пользователем класса. Этот интерфейс присутствует в пакете java.util и содержит 2 метода сравнения (Object obj1, Object obj2) и equals (Элемент Object). Используя компаратор, мы можем сортировать элементы на основе элементов данных. Например, это может быть имя, имя, возраст или что-то еще.

Метод класса Collections для сортировки элементов List используется для сортировки элементов List по заданному компаратору.

Пожалуйста, учтите, что спецификации и другая информация, содержащаяся здесь, не являются заключительными и могут быть изменены. Информация доступна для вас исключительно ради ознакомления.

  • Сводка:
  • Вложенный |
  • Поле |
  • Constr |
  • Детально:
  • Поле |
  • Constr |

Компаратор интерфейса

  • Введите Параметры: T - тип объектов, которые могут быть сравнены этим компаратором Все Известные Классы с реализацией: Сортировально-подборочная машина, RuleBasedCollator Функциональный Интерфейс: Это - функциональный интерфейс и может поэтому использоваться в качестве цели присвоения для ссылки метода или лямбда-выражения.

Функция сравнения, которая налагает полное упорядочивание на некоторый набор объектов. Компараторы можно передать к методу вида (такой как Collections.sort или Arrays.sort ) позволить точное управление порядком сортировки. Компараторы могут также использоваться, чтобы управлять порядком определенных структур данных (такой как sorted sets или sorted maps ), или обеспечить упорядочивание для наборов объектов, у которых нет a natural ordering .

Предостережение должно быть осуществлено при использовании компаратора, способного к наложению упорядочивания, непоследовательного с, равняется, чтобы упорядочить сортированный набор (или сортированная карта). Предположите сортированный набор (или сортированная карта) с явным компаратором, c используется с элементами (или ключи) оттянутый из набора S. Если упорядочивание, наложенное c на S, непоследовательно с, равняется, сортированный набор (или сортированная карта) будет вести себя "странно". В особенности сортированный набор (или сортированная карта) нарушит общий контракт для набора (или карта), который определяется с точки зрения equals.

Отметьте: Это - обычно хорошая идея для компараторов, чтобы также реализовать java.io.Serializable, поскольку они могут использоваться в качестве упорядочивания методов в сериализуемых структурах данных (как TreeSet , TreeMap ). Для структуры данных, чтобы сериализировать успешно, компаратор (если обеспечено) должен реализовать Serializable.

Для математически наклоненного, отношение, которое определяет наложенное упорядочивание, которое данный компаратор c налагает на данный набор объектов, которые S: Частное для этого полного порядка: Это сразу следует из контракта для compare, что частное является отношением эквивалентности на S, и что наложенное упорядочивание является полным порядком на S. То, когда мы говорим, что упорядочивание, наложенное c на S, является непротиворечивым с, равняется, мы подразумеваем, что частное для упорядочивания является отношением эквивалентности, определенным объектами equals(Object) метод (ы):

В отличие от этого Comparable , компаратор может дополнительно разрешить сравнение нулевых параметров, поддерживая требования для отношения эквивалентности.

Этот интерфейс является элементом Платформы Наборов Java.

Сводка метода

Все Методы Методы экземпляра Абстрактные Методы Методы значения по умолчанию
Модификатор и Тип Метод и Описание
int compare(T o1, T o2)

Деталь метода

сравниться

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

В предшествующем описании нотации sgn( expression) определяет математическую сигнум-функцию, которая определяется, чтобы возвратить один из -1, 0, или 1 согласно тому, отрицательно ли значение выражения, нуль или положительно.

Конструктор должен гарантировать что sgn(compare(x, y)) == -sgn(compare(y, x)) для всего x и y. (Это подразумевает, что compare(x, y) должен выдать исключение, если и только если compare(y, x) выдает исключение.)

Конструктор должен также гарантировать, что отношение является переходным: ((compare(x, y)>0) && (compare(y, z)>0)) подразумевает compare(x, z)>0.

Наконец, конструктор должен гарантировать, что compare(x, y)==0 подразумевает что sgn(compare(x, z))==sgn(compare(y, z)) для всего z.

Это обычно имеет место, но не строго требуемое тот (compare(x, y)==0) == (x.equals(y)). Вообще говоря, любой компаратор, который нарушает это условие, должен ясно указать на этот факт. Рекомендуемый язык является "Примечанием: этот компаратор налагает упорядочивания, которые непоследовательны с, равняется."

равняется

Отметьте, что всегда безопасно не переопределить Object.equals(Object). Однако, переопределение этого метода может, в некоторых случаях, улучшить производительность, позволяя программы решить, что два отличных компаратора налагают тот же самый порядок.

reverseOrder

thenComparing

byLastName может быть составлен с другим Comparator

byFirstName , тогда byLastName.thenComparing(byFirstName) создает a Comparator

какие виды фамилией, и для равных видов фамилий именем.

thenComparing

thenComparing

thenComparing

thenComparing

  • Сводка:
  • Вложенный |
  • Поле |
  • Constr |
  • Детально:
  • Поле |
  • Constr |

Представьте ошибку или функцию
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92

Читайте также: