Интерфейс 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.
Например, предположим, что в пустое TreeSet с компаратором c добавляются два элемента a и b, такие что (a.equals(b) && c.compare(a, b) != 0). Вторая операция 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, 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 и считающий null меньшим, чем ненулевое значение. |
static <T> Comparator |
nullsLast |
Возвращает компаратор, допускающий 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, а этот компаратор не допускает аргументы 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)). - Параметры типа:
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 - Возвращает:
- компаратор, задающий лексикографический порядок, составленный из этого компаратора и ключа сортировки типа
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.
- Параметры типа:
T— тип элемента, реализующийComparable, который требуется сравнить- Возвращает:
- компаратор, задающий естественный порядок для объектов
Comparable. - Начиная с версии:
- 1.8
- См. также:
nullsFirst
static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator)
null меньшим, чем ненулевое значение. Если оба значения — null, они считаются равными. Если оба значения ненулевые, порядок определяется указанным Comparator. Если указанный компаратор равен null, возвращённый компаратор считает все ненулевые значения равными. Возвращённый компаратор является сериализуемым, если указанный компаратор сериализуем.
- Параметры типа:
T— тип сравниваемых элементов- Параметры:
-
comparator—Comparatorдля сравнения ненулевых значений - Возвращает:
- компаратор, считающий
nullменьшим, чем ненулевое значение, и сравнивающий ненулевые объекты с помощью указанногоComparator. - Начиная с версии:
- 1.8
nullsLast
static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
null большим, чем ненулевое значение. Если оба значения — null, они считаются равными. Если оба значения ненулевые, порядок определяется указанным Comparator. Если указанный компаратор равен null, возвращённый компаратор считает все ненулевые значения равными. Возвращённый компаратор является сериализуемым, если указанный компаратор сериализуем.
- Параметры типа:
T— тип сравниваемых элементов- Параметры:
-
comparator—Comparatorдля сравнения ненулевых значений - Возвращает:
- компаратор, считающий
nullбольшим, чем ненулевое значение, и сравнивающий ненулевые объекты с помощью указанногоComparator. - Начиная с версии:
- 1.8
comparing
static <T,U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor, Comparator<? super U> keyComparator)
T, и возвращает Comparator<T>, сравнивающий по этому ключу с помощью указанного Comparator. Возвращённый компаратор является сериализуемым, если указанные функция и компаратор сериализуемы.
- Примечание к API:
- Например, чтобы получить
Comparator, сравнивающий объектыPersonпо фамилии без учёта регистра,Comparator<Person> cmp = Comparator.comparing( Person::getLastName, String.CASE_INSENSITIVE_ORDER); - Параметры типа:
T— тип сравниваемого элементаU— тип ключа сортировки- Параметры:
-
keyExtractor— функция, используемая для извлечения ключа сортировки -
keyComparator—Comparator, используемый для сравнения ключа сортировки - Возвращает:
- компаратор, выполняющий сравнение по извлечённому ключу с помощью указанного
Comparator - Выбрасывает:
-
NullPointerException— если любой из аргументов равен null - Начиная с версии:
- 1.8
comparing
static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor)
Comparable из типа T, и возвращает
Comparator<T>, сравнивающий по этому ключу. Возвращённый компаратор является сериализуемым, если указанная функция также сериализуема.
- Примечание к API:
- Например, чтобы получить
Comparator, сравнивающий объектыPersonпо фамилии,Comparator<Person> byLastName = Comparator.comparing(Person::getLastName); - Параметры типа:
T— тип сравниваемого элементаU— тип ключа сортировкиComparable- Параметры:
-
keyExtractor— функция, используемая для извлечения ключа сортировкиComparable - Возвращает:
- компаратор, выполняющий сравнение по извлечённому ключу
- Выбрасывает:
-
NullPointerException— если аргумент равен null - Начиная с версии:
- 1.8
comparingInt
static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
int из типа T, и возвращает Comparator<T>, сравнивающий по этому ключу. Возвращённый компаратор является сериализуемым, если указанная функция также сериализуема.
- Параметры типа:
T— тип сравниваемого элемента- Параметры:
-
keyExtractor— функция, используемая для извлечения целочисленного ключа сортировки - Возвращает:
- компаратор, выполняющий сравнение по извлечённому ключу
- Выбрасывает:
-
NullPointerException— если аргумент равен null - Начиная с версии:
- 1.8
- См. также:
comparingLong
static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
long из типа T, и возвращает Comparator<T>, сравнивающий по этому ключу. Возвращённый компаратор является сериализуемым, если указанная функция также сериализуема.
- Параметры типа:
T— тип сравниваемого элемента- Параметры:
-
keyExtractor— функция, используемая для извлечения ключа сортировки типа long - Возвращает:
- компаратор, выполняющий сравнение по извлечённому ключу
- Выбрасывает:
-
NullPointerException— если аргумент равен null - Начиная с версии:
- 1.8
- См. также:
comparingDouble
static <T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
double из типа T, и возвращает Comparator<T>, сравнивающий по этому ключу. Возвращённый компаратор является сериализуемым, если указанная функция также сериализуема.
- Параметры типа:
T— тип сравниваемого элемента- Параметры:
-
keyExtractor— функция, используемая для извлечения ключа сортировки типа double - Возвращает:
- компаратор, выполняющий сравнение по извлечённому ключу
- Выбрасывает:
-
NullPointerException— если аргумент равен null - Начиная с версии:
- 1.8
- См. также:
© 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/Comparator.html