Интерфейс 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, компаратор может по желанию допускать сравнение нулевых аргументов, сохраняя при этом требования к отношению эквивалентности.
Этот интерфейс является членом 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> Comparator<T> |
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) Возвращает компаратор, дружественный к нулю, который рассматривает |
static <T> Comparator<T> |
nullsLast(Comparator<? super T> comparator) Возвращает компаратор, дружественный к нулю, который рассматривает |
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(выражение) обозначает математическую функцию signum, которая определяется как возвращающая одно из значений -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)). Как правило, любой компаратор, нарушающий это условие, должен явно указать на этот факт. Рекомендуемый способ — "Примечание: этот компаратор задаёт порядок, несовместимый с методом equals."
- Параметры:
-
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- функция, используемая для извлечения целочисленного ключа сортировки - Возвращает:
- компаратор лексикографического порядка, составленный из этого и целочисленного ключа сортировки
- Исключения:
-
NullPointerException- если аргумент равен null. - С:
- 1.8
- См. также:
-
comparingInt(ToIntFunction),thenComparing(Comparator)
thenComparingLong
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)
Возвращает компаратор лексикографического порядка с функцией, которая извлекает long ключ сортировки.
- Требования к реализации:
- Эта реализация по умолчанию работает так, как если бы
thenComparing(comparingLong(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения длинного ключа сортировки - Возвращает:
- компаратор лексикографического порядка, составленный из этого и длинного ключа сортировки
- Исключения:
-
NullPointerException- если аргумент равен null. - С:
- 1.8
- См. также:
-
comparingLong(ToLongFunction),thenComparing(Comparator)
thenComparingDouble
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
Возвращает компаратор лексикографического порядка с функцией, которая извлекает double ключ сортировки.
- Требования к реализации:
- Эта реализация по умолчанию работает так, как если бы
thenComparing(comparingDouble(keyExtractor)). - Параметры:
-
keyExtractor- функция, используемая для извлечения вещественного ключа сортировки - Возвращает:
- компаратор лексикографического порядка, составленный из этого и вещественного ключа сортировки
- Исключения:
-
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, они считаются равными. Если оба ненулевые, указанный Comparator используется для определения порядка. Если указанный компаратор null, возвращаемый компаратор считает все ненулевые значения равными.
Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Параметры типа:
-
T- тип элементов, которые будут сравниваться - Параметры:
-
comparator- компаратор для сравнения ненулевых значений - Возвращает:
- компаратор, который считает
nullменьшим, чем ненулевое значение, и сравнивает ненулевые объекты с помощью указанногоComparator. - С:
- 1.8
nullsLast
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
Возвращает компаратор, дружественный к значениям null, который считает null большим, чем ненулевое значение. Если оба значения null, они считаются равными. Если оба ненулевые, указанный Comparator используется для определения порядка. Если указанный компаратор null, возвращаемый компаратор считает все ненулевые значения равными.
Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Параметры типа:
-
T- тип элементов, которые будут сравниваться - Параметры:
-
comparator- компаратор для сравнения ненулевых значений - Возвращает:
- компаратор, который считает
nullбольшим, чем ненулевое значение, и сравнивает ненулевые объекты с помощью указанногоComparator. - С:
- 1.8
comparing
static <T,U> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor,
Comparator<? super U> keyComparator) Принимает функцию, которая извлекает ключ сортировки из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки с использованием указанного Comparator.
Возвращаемый компаратор сериализуем, если указанная функция и компаратор сериализуемы.
- Примечание API:
- Например, чтобы получить компаратор, который сравнивает объекты
Personпо фамилии, игнорируя различия в регистре,Comparator<Person> cmp = Comparator.comparing( Person::getLastName, String.CASE_INSENSITIVE_ORDER); - Параметры типа:
-
T- тип элемента, который будет сравниваться -
U- тип ключа сортировки - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки -
keyComparator- компаратор, используемый для сравнения ключа сортировки - Возвращает:
- компаратор, который сравнивает по извлеченному ключу с использованием указанного
Comparator - Исключения:
-
NullPointerException- если любой из аргументов null - С:
- 1.8
comparing
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
Принимает функцию, которая извлекает ключ сортировки Comparable из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Примечание API:
- Например, чтобы получить компаратор, который сравнивает объекты
Personпо фамилии,Comparator<Person> byLastName = Comparator.comparing(Person::getLastName);
- Параметры типа:
-
T- тип элемента, который будет сравниваться -
U- тип ключа сортировки - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировкиComparable - Возвращает:
- компаратор, который сравнивает по извлеченному ключу
- Исключения:
-
NullPointerException- если аргумент null - С:
- 1.8
comparingInt
static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
Принимает функцию, которая извлекает ключ сортировки типа int из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Параметры типа:
-
T- тип элемента, который будет сравниваться - Параметры:
-
keyExtractor- функция, используемая для извлечения целого ключа сортировки - Возвращает:
- компаратор, который сравнивает по извлеченному ключу
- Исключения:
-
NullPointerException- если аргумент null - С:
- 1.8
- См. также:
comparing(Function)
comparingLong
static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
Принимает функцию, которая извлекает ключ сортировки типа long из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Параметры типа:
-
T- тип элемента, который будет сравниваться - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа long - Возвращает:
- компаратор, который сравнивает по извлеченному ключу
- Исключения:
-
NullPointerException- если аргумент null - С:
- 1.8
- См. также:
comparing(Function)
comparingDouble
static <T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
Принимает функцию, которая извлекает ключ сортировки типа double из типа T, и возвращает компаратор, который сравнивает по этому ключу сортировки.
Возвращаемый компаратор сериализуем, если указанная функция также сериализуема.
- Параметры типа:
-
T- тип элемента, который будет сравниваться - Параметры:
-
keyExtractor- функция, используемая для извлечения ключа сортировки типа double - Возвращает:
- компаратор, который сравнивает по извлеченному ключу
- Исключения:
-
NullPointerException- если аргумент null - С:
- 1.8
- См. также:
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.