Интерфейс Comparator<T>
- Параметры типа:
-
T- тип объектов, которые могут быть сравнены этим компаратором
- Все известные реализующие классы:
-
Collator,RuleBasedCollator
- Функциональный интерфейс:
- Это функциональный интерфейс, поэтому он может быть использован в качестве целевого назначения для лямбда-выражения или ссылки на метод.
@FunctionalInterface public interface Comparator<T>
Функция сравнения, которая накладывает полный порядок на некоторое множество объектов. Компараторы могут быть переданы методу сортировки (например, Collections.sort или Arrays.sort), чтобы обеспечить точный контроль над порядком сортировки. Компараторы также могут использоваться для управления порядком некоторых структур данных (таких как sorted sets или sorted maps), или для предоставления порядка для наборов объектов, у которых нет natural ordering.
Порядок, налагаемый компаратором 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)}. В отличие от Comparable, компаратор может по желанию допускать сравнение аргументов null, сохраняя при этом требования к отношению эквивалентности.
Этот интерфейс является частью Java Collections Framework.
- С тех пор:
- 1.2
- См. также:
-
Comparable,Serializable
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
int | compare(T o1,
T o2) | Сравнивает свои два аргумента по порядку. |
static <T,U extends Comparable<? super U>> | comparing(Function<? super T,? extends U> keyExtractor) | Принимает функцию, которая извлекает |
static <T,U> | comparing(Function<? super T,? extends U> keyExtractor,
Comparator<? super U> keyComparator) | Принимает функцию, которая извлекает ключ сортировки из типа |
static <T> Comparator<T> | comparingDouble(ToDoubleFunction<? super T> keyExtractor) | Принимает функцию, которая извлекает |
static <T> Comparator<T> | comparingInt(ToIntFunction<? super T> keyExtractor) | Принимает функцию, которая извлекает |
static <T> Comparator<T> | comparingLong(ToLongFunction<? super T> keyExtractor) | Принимает функцию, которая извлекает |
boolean | equals(Object obj) | Указывает, является ли какой-либо другой объект "равным" этому компаратору. |
static <T extends Comparable<? super T>> | naturalOrder() | Возвращает компаратор, который сравнивает объекты |
static <T> Comparator<T> | nullsFirst(Comparator<? super T> comparator) | Возвращает компаратор, дружественный к null, который рассматривает |
static <T> Comparator<T> | nullsLast(Comparator<? super T> comparator) | Возвращает компаратор, дружественный к null, который рассматривает |
default Comparator<T> | reversed() | Возвращает компаратор, который накладывает обратный порядок этого компаратора. |
static <T extends Comparable<? super T>> | reverseOrder() | Возвращает компаратор, который накладывает обратный порядок естественного порядка. |
default Comparator<T> | thenComparing(Comparator<? super T> other) | Возвращает компаратор лексикографического порядка с другим компаратором. |
default <U extends Comparable<? super U>> | thenComparing(Function<? super T,? extends U> keyExtractor) | Возвращает компаратор лексикографического порядка с функцией, которая извлекает |
default <U> Comparator<T> | thenComparing(Function<? super T,? extends U> keyExtractor,
Comparator<? super U> keyComparator) | Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ для сравнения с заданным |
default Comparator<T> | thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) | Возвращает компаратор лексикографического порядка с функцией, которая извлекает |
default Comparator<T> | thenComparingInt(ToIntFunction<? super T> keyExtractor) | Возвращает компаратор лексикографического порядка с функцией, которая извлекает |
default Comparator<T> | thenComparingLong(ToLongFunction<? super T> keyExtractor) | Возвращает компаратор лексикографического порядка с функцией, которая извлекает |
Методы
compare
int compare(T o1,
T o2) Сравнивает два аргумента по порядку. Возвращает отрицательное целое число, ноль или положительное целое число в зависимости от того, меньше ли, равно ли или больше ли первый аргумент, чем второй.
Реализатор должен гарантировать, что 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)). В общем, любой компаратор, нарушающий это условие, должен четко указывать на этот факт. Рекомендуемый язык: «Примечание: этот компаратор накладывает порядок, несовместимый с equals».
В приведенном выше описании обозначение sgn(expression) обозначает математическую функцию signum, которая определена как возвращающая одно из -1, 0, или 1 в зависимости от того, является ли значение expression отрицательным, нулевым или положительным соответственно.
- Параметры:
-
o1- первый объект для сравнения. -
o2- второй объект для сравнения. - Возвращает:
- отрицательное целое число, ноль или положительное целое число в зависимости от того, меньше ли, равно ли или больше ли первый аргумент, чем второй.
- Исключения:
-
NullPointerException- если аргумент равен null, и этот компаратор не допускает аргументов null -
ClassCastException- если типы аргументов препятствуют их сравнению этим компаратором.
equals
boolean equals(Object obj)
Указывает, является ли какой-либо другой объект «равным» этому компаратору. Этот метод должен подчиняться общему контракту Object.equals(Object). Кроме того, этот метод может возвращать true только в том случае, если указанный объект также является компаратором, и он накладывает тот же порядок, что и этот компаратор. Таким образом, comp1.equals(comp2) подразумевает, что sgn(comp1.compare(o1,
o2))==sgn(comp2.compare(o1, o2)) для каждой ссылки на объект o1 и o2.
Обратите внимание, что всегда безопасно не переопределять Object.equals(Object). Однако переопределение этого метода может в некоторых случаях повысить производительность, позволяя программам определять, что два различных компаратора накладывают один и тот же порядок.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
obj- объектная ссылка, с которой нужно сравнивать. - Возвращает:
-
trueтолько если указанный объект также является компаратором, и он накладывает тот же порядок, что и этот компаратор. - См. также:
-
Object.equals(Object),Object.hashCode()
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
- См. также:
-
comparing(Function, Comparator),thenComparing(Comparator)
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
- См. также:
-
comparing(Function),thenComparing(Comparator)
thenComparingInt
default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки int.
- Требования к реализации:
- Эта реализация по умолчанию работает так, как будто
thenComparing(comparingInt(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения целочисленного ключа сортировки - Возвращает:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
int - Исключения:
-
NullPointerException- если аргумент равен null. - С:
- 1.8
- См. также:
-
comparingInt(ToIntFunction),thenComparing(Comparator)
thenComparingLong
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки long.
- Требования к реализации:
- Эта реализация по умолчанию работает так, как будто
thenComparing(comparingLong(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа long - Возвращает:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
long - Исключения:
-
NullPointerException- если аргумент равен null. - С:
- 1.8
- См. также:
-
comparingLong(ToLongFunction),thenComparing(Comparator)
thenComparingDouble
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
Возвращает компаратор лексикографического порядка с функцией, которая извлекает ключ сортировки double.
- Требования к реализации:
- Эта реализация по умолчанию работает так, как будто
thenComparing(comparingDouble(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа double - Возвращает:
- компаратор лексикографического порядка, составленный из этого и затем ключа сортировки
double - Исключения:
-
NullPointerException- если аргумент равен null. - С:
- 1.8
- См. также:
-
comparingDouble(ToDoubleFunction),thenComparing(Comparator)
reverseOrder
static <T extends Comparable<? super T>> Comparator<T> reverseOrder()
Возвращает компаратор, который накладывает обратный естественный порядок.
Возвращаемый компаратор сериализуем и вызывает NullPointerException при сравнении null.
- Параметры типа:
-
T- типComparableэлемента для сравнения - Возвращает:
- компаратор, который накладывает обратный естественный порядок на объекты
Comparable. - С:
- 1.8
- См. также:
Comparable
naturalOrder
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
Возвращает компаратор, который сравнивает объекты Comparable в естественном порядке.
Возвращаемый компаратор сериализуем и вызывает NullPointerException при сравнении null.
- Параметры типа:
-
T- типComparableэлемента для сравнения - Возвращает:
- компаратор, который накладывает естественный порядок на объекты
Comparable. - С:
- 1.8
- См. также:
Comparable
nullsFirst
static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator)
Возвращает компаратор, совместимый с null, который считает null меньше, чем не-null. Если оба значения null, они считаются равными. Если оба значения не-null, заданный Comparator используется для определения порядка. Если заданный компаратор null, тогда возвращаемый компаратор считает все не-null значения равными.
Возвращаемый компаратор сериализуем, если заданный компаратор сериализуем.
- Type Parameters:
-
T- тип элементов, подлежащих сравнению - Parameters:
-
comparator-Comparatorдля сравнения не-null значений - Returns:
- компаратор, который считает
nullменьше, чем не-null, и сравнивает не-null объекты с заданнымComparator. - Since:
- 1.8
nullsLast
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
Возвращает компаратор, совместимый с null, который считает null больше, чем не-null. Если оба значения null, они считаются равными. Если оба значения не-null, заданный Comparator используется для определения порядка. Если заданный компаратор null, тогда возвращаемый компаратор считает все не-null значения равными.
Возвращаемый компаратор сериализуем, если заданный компаратор сериализуем.
- Type Parameters:
-
T- тип элементов, подлежащих сравнению - Parameters:
-
comparator-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<T>, который сравнивает по этому ключу сортировки с использованием указанного Comparator.
Возвращаемый компаратор сериализуем, если заданная функция и компаратор оба сериализуемы.
- API Note:
- Например, чтобы получить
Comparatorдля сравнения объектовPersonпо фамилии, игнорируя различия в регистре,Comparator<Person> cmp = Comparator.comparing( Person::getLastName, String.CASE_INSENSITIVE_ORDER); - Type Parameters:
-
T- тип элемента, подлежащего сравнению -
U- тип ключа сортировки - Parameters:
-
keyExtractor- функция, используемая для извлечения ключа сортировки -
keyComparator-Comparatorдля сравнения ключа сортировки - 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, и возвращает
Comparator<T>, который сравнивает по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если заданная функция также сериализуема.
- API Note:
- Например, чтобы получить
Comparatorдля сравнения объектов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, и возвращает Comparator<T> для сравнения по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если заданная функция также сериализуема.
- Type Parameters:
-
T- тип элемента, подлежащего сравнению - Parameters:
-
keyExtractor- функция, используемая для извлечения целого ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
comparing(Function)
comparingLong
static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
Принимает функцию, которая извлекает ключ сортировки long из типа T, и возвращает Comparator<T> для сравнения по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если заданная функция также сериализуема.
- Type Parameters:
-
T- тип элемента, подлежащего сравнению - Parameters:
-
keyExtractor- функция, используемая для извлечения длинного ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
comparing(Function)
comparingDouble
static <T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
Принимает функцию, которая извлекает ключ сортировки double из типа T, и возвращает Comparator<T> для сравнения по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если заданная функция также сериализуема.
- Type Parameters:
-
T- тип элемента, подлежащего сравнению - Parameters:
-
keyExtractor- функция, используемая для извлечения двойного ключа сортировки - Returns:
- компаратор, который сравнивает по извлеченному ключу
- Throws:
-
NullPointerException- если аргумент равен null - Since:
- 1.8
- See Also:
comparing(Function)
© 1993, 2020, 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/11/docs/api/java.base/java/util/Comparator.html