Я знаю, что если один переопределяет равным, hashCode также должен быть переопределен. Существуют ли какие-либо аналогичные правила, которые применяются к переопределению compareTo?Каковы последствия для переопределения compareTo?
Это вопрос Java.
Я знаю, что если один переопределяет равным, hashCode также должен быть переопределен. Существуют ли какие-либо аналогичные правила, которые применяются к переопределению compareTo?Каковы последствия для переопределения compareTo?
Это вопрос Java.
ожиданий него можно прочитать здесь: http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
Та часть, которая будет представлять наибольший интерес для вас, вероятно:
настоятельно рекомендуется (хотя и не обязательно), что естественный упорядочения должны совпадать с равными. Это связано с тем, что отсортированные наборы (и отсортированные карты) без явных компараторов ведут себя «странно», когда используются с элементами (или ключами), естественный порядок которых несовместим с равными. В частности, такой сортированный набор (или отсортированная карта ) нарушает общий контракт для множества (или карты), который определяется в терминах метода equals.
Это объясняется в JavaDocs:
Естественное упорядочение для класса
C
называется согласуется с равным тогда и только тогда, когдаe1.compareTo(e2) == 0
имеет то же логическое значение, какe1.equals(e2)
для каждогоe1
иe2
классаC
Обратите внимание, что это не требуется, то есть если два класса равны в соответствии с compareTo()
, им не нужно удерживать equals()
. Это нормально, потому что вы можете, например, сортировать людей по возрасту, поэтому два человека с одинаковым возрастом считаются равными по отношению к Comparator<Person>
, но они, очевидно, не обязательно должны быть равными.
Однако в этом конкретном случае вы можете добавить дополнительные атрибуты к компаратору, если возрасты равны (поэтому сортировка всегда стабильна и предсказуема для людей одного и того же возраста), поэтому в конце концов, включая те же атрибуты в compareTo()
, может быть хорошей идеей в некоторых случаях.
Это хороший момент, который, похоже, применим к моему делу. Я измеряю полезность объектов и сортировку по утилите. (Как и экономическое определение полезности). Но эти объекты не равны. Утилита может совпадать по совпадению. – H2ONaCl
Если compareTo используется только для сортировки, нет никакого вреда, кроме эффекта скорости, при добавлении полей к сравнению. Таким образом, compareTo можно сделать «согласованным» с равными. – H2ONaCl
документация для Comparator
имеет такое предупреждение:
Упорядочение налагается компаратор с на множестве элементов S называется в соответствии с равными тогда и только тогда, когда c.compare (e1, e2) == 0 имеет то же булево значение, что и e1.equals (e2) для всех e1 и e2 в S.
Следует соблюдать осторожность при использовании компаратора, способного накладывать порядок, не соответствующий порядку упорядоченного набора (например, или отсортированную карту). Предположим, что отсортированный набор (или отсортированная карта) с явным компаратором c используется с элементами (или ключами), взятыми из набора S. Если порядок, наложенный c на S, несовместим с равными, отсортированный набор (или отсортированная карта) будет ведут себя «странно». В частности, сортированный набор (или отсортированная карта) нарушит общий контракт для множества (или карты), который определяется в терминах равных.
Я хочу просто сказать вам, что у вас должны быть определенные свойства или атрибуты в объектах, которые вы будете использовать для сравнения двух объектов одного типа.
Вскоре после опубликования ссылки я решил не лениться и на самом деле скопировать/вставить в ответ :) – Corbin