Интерфейс 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, U extends Comparable<? super U>> |
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 меньше, чем ненулевой. |
static <T> Comparator |
nullsLast |
Возвращает дружественный к нулю компаратор, который считает 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, и этот компаратор не допускает 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). Однако переопределение этого метода может в некоторых случаях повысить производительность, позволяя программам определять, что два разных компаратора накладывают один и тот же порядок.
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, cmp)). - Параметры типа:
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.
- Type Parameters:
T- тип элемента, который должен быть сравнен, реализующий интерфейсComparable- Returns:
- компаратор, который накладывает обратный порядок сортировки по умолчанию на объекты
Comparable. - Since:
- 1.8
- See Also:
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)
Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Type Parameters:
T- тип элементов, которые сравниваются- Parameters:
-
comparator- компаратор для сравнения значений, не равных null - Returns:
- компаратор, который считает null меньшим, чем не-null, и сравнивает не-null объекты с помощью переданного компаратора.
- Since:
- 1.8
nullsLast
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
Возвращаемый компаратор сериализуем, если указанный компаратор сериализуем.
- Type Parameters:
T- тип элементов, которые сравниваются- Parameters:
-
comparator- компаратор для сравнения значений, не равных null - Returns:
- компаратор, который считает null большим, чем не-null, и сравнивает не-null объекты с помощью переданного компаратора.
- 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:
- компаратор, который сравнивает по извлеченному ключу, используя указанный компаратор
- 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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/Comparator.html