Как сделать компаратор java
Такие структуры данных, как 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
Читайте также: