Интерфейс Comparator<T>
- Параметры типа:
-
T- тип объектов, которые могут быть сравнены этим компаратором
- Все известные реализующие классы:
-
Collator,RuleBasedCollator
- Функциональный интерфейс:
- Это функциональный интерфейс и, следовательно, может использоваться в качестве целевого назначения для лямбда-выражения или ссылки на метод.
@FunctionalInterface public interface Comparator<T>
Collections.sort или Arrays.sort), чтобы обеспечить точный контроль над порядком сортировки. Компараторы также могут использоваться для управления порядком определённых структур данных (таких как упорядоченные множества или упорядоченные карты), или для задания порядка для коллекций объектов, которые не имеют естественного порядка. Порядок, накладываемый компаратором c на множество элементов S , считается совместимым с equals тогда и только тогда, когда c.compare(e1, e2)==0 имеет то же булево значение, что и e1.equals(e2) для каждого e1 и e2 в S.
Следует проявлять осторожность при использовании компаратора, способного накладывать порядок, несовместимый с equals, для упорядочения упорядоченного множества (или упорядоченной карты). Предположим, что упорядоченное множество (или упорядоченная карта) с явным компаратором c используется с элементами (или ключами) из множества S. Если порядок, накладываемый компаратором c на S , несовместим с equals, упорядоченное множество (или упорядоченная карта) будет вести себя "странно". В частности, упорядоченное множество (или упорядоченная карта) нарушит общий контракт для множества (или карты), который определяется с использованием equals.
Например, предположим, что мы добавляем два элемента a и b такие, что (a.equals(b) && c.compare(a, b) != 0) в пустое TreeSet с компаратором c. Вторая операция add вернёт true (и размер дерева множества увеличится), потому что a и b не эквивалентны с точки зрения дерева множества, даже если это противоречит спецификации метода Set.add.
Примечание: В целом, рекомендуется, чтобы компараторы также реализовывали java.io.Serializable, так как они могут использоваться в качестве методов упорядочивания в сериализуемых структурах данных (таких как TreeSet, TreeMap). Для успешной сериализации структуры данных компаратор (если он предоставлен) должен реализовывать Serializable.
Для математически подкованных, отношение, которое определяет накладываемый порядок, который данный компаратор c накладывает на заданное множество объектов S , является:
{(x, y) such that c.compare(x, y) <= 0}.
Частное для этого полного порядка:
{(x, y) such that c.compare(x, y) == 0}.
Из контракта для compare непосредственно следует, что частное является отношением эквивалентности на S, а накладываемый порядок является полным порядком на S. Когда мы говорим, что порядок, наложенный компаратором c на S , совместим с equals, мы имеем в виду, что частное для порядка является отношением эквивалентности, определённым методами объекта equals(Object):
{(x, y) such that x.equals(y)}. Другими словами, когда накладываемый порядок совместим с equals, классы эквивалентности, определённые отношением эквивалентности метода equals, и классы эквивалентности, определённые частным метода compare, совпадают. В отличие от Comparable, компаратор может необязательно допускать сравнение аргументов null, сохраняя при этом требования к отношению эквивалентности.
Этот интерфейс является членом Java Collections Framework.
- С тех пор:
- 1.2
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
compare |
Сравнивает два своих аргумента по порядку. |
static <T, |
comparing |
Принимает функцию, которая извлекает ключ сортировки Comparable из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. |
static <T, |
comparing |
Принимает функцию, которая извлекает ключ сортировки из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки, используя указанный Comparator. |
static <T> Comparator<T> |
comparingDouble |
Принимает функцию, которая извлекает ключ сортировки double из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. |
static <T> Comparator<T> |
comparingInt |
Принимает функцию, которая извлекает ключ сортировки int из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. |
static <T> Comparator<T> |
comparingLong |
Принимает функцию, которая извлекает ключ сортировки long из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. |
boolean |
equals |
Указывает, является ли другой объект "равным" этому компаратору. |
static <T extends Comparable<? super T>> |
naturalOrder() |
Возвращает компаратор, который сравнивает объекты Comparable в естественном порядке. |
static <T> Comparator<T> |
nullsFirst |
Возвращает дружественный к null компаратор, который считает null меньше, чем не null. |
static <T> Comparator<T> |
nullsLast |
Возвращает дружественный к null компаратор, который считает null больше, чем не null. |
default Comparator<T> |
reversed() |
Возвращает компаратор, который накладывает обратный порядок этого компаратора. |
static <T extends Comparable<? super T>> |
reverseOrder() |
Возвращает компаратор, который накладывает обратный порядок естественного порядка. |
default Comparator<T> |
thenComparing |
Возвращает компаратор лексикографического порядка с другим компаратором. |
default <U extends Comparable<? super U>> |
thenComparing |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки Comparable. |
default <U> Comparator<T> |
thenComparing |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ для сравнения с заданным Comparator. |
default Comparator<T> |
thenComparingDouble |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки double. |
default Comparator<T> |
thenComparingInt |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки int. |
default Comparator<T> |
thenComparingLong |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки long. |
Краткое описание методов
compare
int compare(T o1, T o2)
Реализатор должен гарантировать, что signum(compare(x, y)) == -signum(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 подразумевает, что signum(compare(x,
z))==signum(compare(y, z)) для всех z.
- Примечание к API:
- В общем случае, но не строго обязательно, что
(compare(x, y)==0) == (x.equals(y)). В общем, любой компаратор, который нарушает это условие, должен четко указывать на этот факт. Рекомендуемый язык: «Примечание: этот компаратор налагает порядок, несовместимый с equals». - Параметры:
-
o1- первый объект для сравнения. -
o2- второй объект для сравнения. - Возвращаемое значение:
- отрицательное целое число, ноль или положительное целое число в зависимости от того, меньше ли, равно или больше первый аргумент, чем второй.
- Исключения:
-
NullPointerException- если аргумент равен null, и этот компаратор не допускает аргументов null -
ClassCastException- если типы аргументов препятствуют их сравнению этим компаратором.
equals
boolean equals(Object obj)
Object.equals(Object). Кроме того, этот метод может возвращать true только если указанный объект также является компаратором, и он накладывает тот же порядок, что и этот компаратор. Таким образом, comp1.equals(comp2) подразумевает, что signum(comp1.compare(o1,
o2))==signum(comp2.compare(o1, o2)) для каждой ссылки на объект o1 и o2. Обратите внимание, что всегда безопасно не переопределять Object.equals(Object). Однако переопределение этого метода может в некоторых случаях повысить производительность, позволяя программам определять, что два разных компаратора накладывают один и тот же порядок.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj- объектная ссылка, с которой необходимо сравнить. - Возвращаемое значение:
-
trueтолько если указанный объект также является компаратором, и он накладывает тот же порядок, что и этот компаратор. - См. также:
reversed
default Comparator<T> reversed()
- Возвращаемое значение:
- компаратор, который накладывает обратный порядок этого компаратора.
- С версии:
- 1.8
thenComparing
default Comparator<T> thenComparing(Comparator<? super T> other)
Comparator считает два элемента равными, т.е. compare(a, b) == 0, other используется для определения порядка. Возвращаемый компаратор сериализуем, если указанный компаратор также сериализуем.
- Примечание к API:
- Например, для сортировки коллекции
Stringпо длине, а затем по регистронезависимому естественному порядку, компаратор можно составить с помощью следующего кода,Comparator<String> cmp = Comparator.comparingInt(String::length) .thenComparing(String.CASE_INSENSITIVE_ORDER); - Параметры:
-
other- другой компаратор, который будет использоваться, когда этот компаратор сравнивает два равных объекта. - Возвращаемое значение:
- компаратор лексикографического порядка, составленный из этого и затем другого компаратора
- Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
thenComparing
default <U> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
Comparator. - Требования к реализации:
- Эта реализация по умолчанию ведет себя так, как будто
thenComparing(comparing(keyExtractor, cmp)). - Параметры типа:
-
U- тип ключа сортировки - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки -
keyComparator-Comparator, используемый для сравнения ключа сортировки - Возвращаемое значение:
- компаратор лексикографического порядка, составленный из этого компаратора, а затем сравнивающий по ключу, извлеченному с помощью функции keyExtractor
- Исключения:
-
NullPointerException- если любой из аргументов равен null. - С версии:
- 1.8
- См. также:
thenComparing
default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor)
Comparable. - Требования к реализации:
- Эта реализация по умолчанию ведет себя так, как будто
thenComparing(comparing(keyExtractor)). - Параметры типа:
-
U- тип ключа сортировкиComparable - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировкиComparable - Возвращаемое значение:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
Comparable. - Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
- См. также:
thenComparingInt
default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)
int. - Требования к реализации:
- Эта реализация по умолчанию ведет себя так, как будто
thenComparing(comparingInt(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа integer - Возвращаемое значение:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
int - Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
- См. также:
thenComparingLong
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)
long. - Требования к реализации:
- Эта реализация по умолчанию ведет себя так, как будто
thenComparing(comparingLong(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа long - Возвращаемое значение:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
long - Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
- См. также:
thenComparingDouble
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
double. - Требования к реализации:
- Эта реализация по умолчанию ведет себя так, как будто
thenComparing(comparingDouble(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа double - Возвращаемое значение:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
double - Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
- См. также:
reverseOrder
static <T extends Comparable<? super T>> Comparator<T> reverseOrder()
Возвращаемый компаратор сериализуем и вызывает NullPointerException при сравнении null.
- Параметры типа:
-
T- типComparableэлемента для сравнения - Возвращаемое значение:
- компаратор, который накладывает обратный естественный порядок на объекты
Comparable. - С версии:
- 1.8
- См. также:
naturalOrder
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
Comparable в естественном порядке. Возвращаемый компаратор сериализуем и выбрасывает NullPointerException при сравнении null.
- Type Parameters:
-
T- типComparableсравниваемого элемента - Returns:
- компаратор, который накладывает естественный порядок на
Comparableобъекты. - Since:
- 1.8
- See Also:
nullsFirst
static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator)
null как меньший, чем не-null. Когда оба значения null, они считаются равными. Если оба не-null, указанный Comparator используется для определения порядка. Если указанный компаратор null, то возвращаемый компаратор считает все не-null значения равными. Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Type Parameters:
-
T- тип сравниваемых элементов - Parameters:
-
comparator- компаратор для сравнения не-null значений - Returns:
- компаратор, который считает
nullменьшим, чем не-null, и сравнивает не-null объекты с помощью переданногоComparator. - Since:
- 1.8
nullsLast
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
null как больший, чем не-null. Когда оба значения null, они считаются равными. Если оба не-null, указанный Comparator используется для определения порядка. Если указанный компаратор null, то возвращаемый компаратор считает все не-null значения равными. Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Type Parameters:
-
T- тип сравниваемых элементов - Parameters:
-
comparator- компаратор для сравнения не-null значений - Returns:
- компаратор, который считает
nullбольшим, чем не-null, и сравнивает не-null объекты с помощью переданногоComparator. - Since:
- 1.8
comparing
static <T, U> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
T, и возвращает компаратор, который сравнивает по этому ключу сортировки с использованием указанного Comparator. Возвращаемый компаратор сериализуем, если указанная функция и компаратор оба сериализуемы.
- API Note:
- Например, чтобы получить компаратор, который сравнивает объекты
Personпо их фамилии, игнорируя различия в регистре,Comparator<Person> cmp = Comparator.comparing( Person::getLastName, String.CASE_INSENSITIVE_ORDER); - Type Parameters:
-
T- тип сравниваемого элемента -
U- тип ключа сортировки - Parameters:
-
keyExtractor- функция, используемая для извлечения ключа сортировки -
keyComparator- компаратор, используемый для сравнения ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу с использованием указанного
Comparator - Throws:
-
NullPointerException- если какой-либо аргумент равен null - Since:
- 1.8
comparing
static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
Comparable из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- API Note:
- Например, чтобы получить компаратор, который сравнивает объекты
Personпо их фамилии,Comparator<Person> byLastName = Comparator.comparing(Person::getLastName); - Type Parameters:
-
T- тип сравниваемого элемента -
U- тип ключаComparableсортировки - Parameters:
-
keyExtractor- функция, используемая для извлечения ключа сортировкиComparable - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
comparingInt
static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
int из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Type Parameters:
-
T- тип сравниваемого элемента - Parameters:
-
keyExtractor- функция, используемая для извлечения целого ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
comparingLong
static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
long из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Type Parameters:
-
T- тип сравниваемого элемента - Parameters:
-
keyExtractor- функция, используемая для извлечения длинного ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
comparingDouble
static <T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
double из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки. Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Type Parameters:
-
T- тип сравниваемого элемента - Parameters:
-
keyExtractor- функция, используемая для извлечения двойного ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Comparator.html