Spec-Zone .ru
спецификации, руководства, описания, API
|
T
- тип объектов, которые могут быть сравнены этим компараторомpublic interface Comparator<T>
Collections.sort
или Arrays.sort
) позволить точное управление порядком сортировки. Компараторы могут также использоваться, чтобы управлять порядком определенных структур данных (такой как sorted sets
или sorted maps
), или обеспечить упорядочивание для наборов объектов, у которых нет a natural ordering
.Упорядочивание, наложенное компаратором, которому равняется c на ряде элементов, с которыми S, как говорят, является непротиворечивым, если и только если у c.compare(e1, e2)==0 есть то же самое булево значение как e1.equals(e2) для каждого e1 и e2 в S.
Предостережение должно быть осуществлено при использовании компаратора, способного к наложению упорядочивания, непоследовательного с, равняется, чтобы упорядочить сортированный набор (или сортированная карта). Предположите сортированный набор (или сортированная карта) с явным компаратором, c используется с элементами (или ключи) оттянутый из набора S. Если упорядочивание, наложенное c на S, непоследовательно с, равняется, сортированный набор (или сортированная карта) будет вести себя "странно". В особенности сортированный набор (или сортированная карта) нарушит общий контракт для набора (или карта), который определяется с точки зрения 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(Object)
метод (ы):{(x, y) such that x.equals(y)}.
В отличие от этого Comparable
, компаратор может дополнительно разрешить сравнение нулевых параметров, поддерживая требования для отношения эквивалентности.
Этот интерфейс является элементом Платформы Наборов Java.
Comparable
, Serializable
int compare(T o1, T o2)
В предшествующем описании нотации sgn( expression) определяет математическую сигнум-функцию, которая определяется, чтобы возвратить один из -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)). Вообще говоря, любой компаратор, который нарушает это условие, должен ясно указать на этот факт. Рекомендуемый язык является "Примечанием: этот компаратор налагает упорядочивания, которые непоследовательны с, равняется."
o1
- первый объект, который будет сравнен.o2
- второй объект, который будет сравнен.NullPointerException
- если параметром является нуль, и этот компаратор не разрешает нулевые параметрыClassCastException
- если типы параметров препятствуют тому, чтобы они были сравнены этим компаратором.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()
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.