2012-03-18 2 views
0

Я знаю, что если один переопределяет равным, hashCode также должен быть переопределен. Существуют ли какие-либо аналогичные правила, которые применяются к переопределению compareTo?Каковы последствия для переопределения compareTo?

Это вопрос Java.

+0

Вскоре после опубликования ссылки я решил не лениться и на самом деле скопировать/вставить в ответ :) – Corbin

ответ

3

ожиданий него можно прочитать здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

Та часть, которая будет представлять наибольший интерес для вас, вероятно:

настоятельно рекомендуется (хотя и не обязательно), что естественный упорядочения должны совпадать с равными. Это связано с тем, что отсортированные наборы (и отсортированные карты) без явных компараторов ведут себя «странно», когда используются с элементами (или ключами), естественный порядок которых несовместим с равными. В частности, такой сортированный набор (или отсортированная карта ) нарушает общий контракт для множества (или карты), который определяется в терминах метода equals.

0

Это объясняется в JavaDocs:

Естественное упорядочение для класса C называется согласуется с равным тогда и только тогда, когда e1.compareTo(e2) == 0 имеет то же логическое значение, как e1.equals(e2) для каждого e1 и e2 класса C

Обратите внимание, что это не требуется, то есть если два класса равны в соответствии с compareTo(), им не нужно удерживать equals(). Это нормально, потому что вы можете, например, сортировать людей по возрасту, поэтому два человека с одинаковым возрастом считаются равными по отношению к Comparator<Person>, но они, очевидно, не обязательно должны быть равными.

Однако в этом конкретном случае вы можете добавить дополнительные атрибуты к компаратору, если возрасты равны (поэтому сортировка всегда стабильна и предсказуема для людей одного и того же возраста), поэтому в конце концов, включая те же атрибуты в compareTo(), может быть хорошей идеей в некоторых случаях.

+0

Это хороший момент, который, похоже, применим к моему делу. Я измеряю полезность объектов и сортировку по утилите. (Как и экономическое определение полезности). Но эти объекты не равны. Утилита может совпадать по совпадению. – H2ONaCl

+0

Если compareTo используется только для сортировки, нет никакого вреда, кроме эффекта скорости, при добавлении полей к сравнению. Таким образом, compareTo можно сделать «согласованным» с равными. – H2ONaCl

0

документация для Comparator имеет такое предупреждение:

Упорядочение налагается компаратор с на множестве элементов S называется в соответствии с равными тогда и только тогда, когда c.compare (e1, e2) == 0 имеет то же булево значение, что и e1.equals (e2) для всех e1 и e2 в S.

Следует соблюдать осторожность при использовании компаратора, способного накладывать порядок, не соответствующий порядку упорядоченного набора (например, или отсортированную карту). Предположим, что отсортированный набор (или отсортированная карта) с явным компаратором c используется с элементами (или ключами), взятыми из набора S. Если порядок, наложенный c на S, несовместим с равными, отсортированный набор (или отсортированная карта) будет ведут себя «странно». В частности, сортированный набор (или отсортированная карта) нарушит общий контракт для множества (или карты), который определяется в терминах равных.

0

Я хочу просто сказать вам, что у вас должны быть определенные свойства или атрибуты в объектах, которые вы будете использовать для сравнения двух объектов одного типа.