Интерфейс 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, компаратор может необязательно разрешать сравнение нулевых аргументов, сохраняя при этом требования к отношению эквивалентности.
Этот интерфейс является членом Java Collections Framework.
- С:
- 1.2
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
compare |
Сравнивает свои два аргумента по порядку. |
static <T, |
comparing |
Принимает функцию, которая извлекает Comparable ключ сортировки из типа T, и возвращает
Comparator<T>, который сравнивает по этому ключу сортировки. |
static <T, |
comparing |
Принимает функцию, которая извлекает ключ сортировки из типа T, и возвращает Comparator<T> , который сравнивает по этому ключу сортировки, используя указанный Comparator. |
static <T> Comparator |
comparingDouble |
Принимает функцию, которая извлекает double ключ сортировки из типа T, и возвращает Comparator<T> , который сравнивает по этому ключу сортировки. |
static <T> Comparator |
comparingInt |
Принимает функцию, которая извлекает int ключ сортировки из типа T, и возвращает Comparator<T> , который сравнивает по этому ключу сортировки. |
static <T> Comparator |
comparingLong |
Принимает функцию, которая извлекает long ключ сортировки из типа T, и возвращает Comparator<T> , который сравнивает по этому ключу сортировки. |
boolean |
equals |
Указывает, является ли какой-либо другой объект «равным» этому компаратору. |
static <T extends Comparable<? super T>> |
naturalOrder() |
Возвращает компаратор, который сравнивает объекты Comparable в естественном порядке. |
static <T> Comparator |
nullsFirst |
Возвращает компаратор, дружественный к null, который рассматривает null как меньший, чем не null. |
static <T> Comparator |
nullsLast |
Возвращает компаратор, дружественный к null, который рассматривает null как больший, чем не null. |
default Comparator |
reversed() |
Возвращает компаратор, который накладывает обратный порядок этого компаратора. |
static <T extends Comparable<? super T>> |
reverseOrder() |
Возвращает компаратор, который накладывает обратный порядок естественного порядка. |
default Comparator |
thenComparing |
Возвращает компаратор лексикографического порядка с другим компаратором. |
default <U extends Comparable<? super U>> |
thenComparing |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает Comparable ключ сортировки. |
default <U> Comparator |
thenComparing |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ для сравнения с заданным Comparator. |
default Comparator |
thenComparingDouble |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает double ключ сортировки. |
default Comparator |
thenComparingInt |
Возвращает компаратор лексикографического порядка с функцией, которая извлекает int ключ сортировки. |
default Comparator |
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, а этот компаратор не допускает нулевых аргументов -
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- функция, используемая для извлечения ключа сортировки целого числа - Возвращает:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
int - Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
- См. также:
thenComparingLong
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)
long. - Требования к реализации:
- Эта реализация по умолчанию работает так, как будто
thenComparing(comparingLong(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки длинного целого числа - Возвращает:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
long - Исключения:
-
NullPointerException- если аргумент равен null. - С версии:
- 1.8
- См. также:
thenComparingDouble
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
double. - Требования к реализации:
- Эта реализация по умолчанию работает так, как будто
thenComparing(comparingDouble(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки с плавающей точкой двойной точности - Возвращает:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
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)
Comparator. Если указанный компаратор является null, возвращаемый компаратор считает все ненулевые значения равными. Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Type Parameters:
-
T- тип элементов для сравнения - Parameters:
-
comparator- компаратор для сравнения ненулевых значений - Returns:
- компаратор, который считает null меньше, чем не-null, и сравнивает не-null объекты с помощью предоставленного
Comparator. - Since:
- 1.8
nullsLast
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
Comparator. Если указанный компаратор является null, возвращаемый компаратор считает все ненулевые значения равными. Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Type Parameters:
-
T- тип элементов для сравнения - Parameters:
-
comparator- компаратор для сравнения ненулевых значений - 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- тип ключа сортировки - Parameters:
-
keyExtractor- функция, используемая для извлечения ключа сортировкиComparable - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
comparingInt
static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
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)
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)
T, и возвращает компаратор, который сравнивает по этому ключу сортировки. Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Type Parameters:
-
T- тип элемента для сравнения - Parameters:
-
keyExtractor- функция, используемая для извлечения вещественного ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
© 1993, 2023, 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/21/docs/api/java.base/java/util/Comparator.html