Каковы последствия для переопределения сравнить? - PullRequest
0 голосов
/ 18 марта 2012

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

Это вопрос Java.

Ответы [ 4 ]

3 голосов
/ 18 марта 2012

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

Часть, которая будет наиболее интересна для вас, вероятно:

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

0 голосов
/ 18 марта 2012

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

0 голосов
/ 18 марта 2012

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

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

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

0 голосов
/ 18 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...