Это, кажется, нарушает запрет
чтобы компаратор был последовательным
с равными () - т.е. две коллекции
может быть неравным (имея разные
элементы), но сравнить с тем же
значение (потому что они имеют одинаковое
количество элементов).
Нет никакого требования, заявленного (в Javadoc) или подразумеваемого, что Comparator
должен соответствовать реализации объекта boolean equals(Object)
.
Обратите внимание, что Comparable
и Comparator
являются различными интерфейсами с различными целями. Comparable
используется для определения «естественного» порядка для класса. В этом контексте было бы плохой идеей для equals
и compateTo
быть несовместимым. Напротив, Comparator
используется, когда вы хотите использовать порядок, отличный от естественного порядка класса.
РЕДАКТИРОВАТЬ: Вот полный абзац из Javadoc для SortedSet.
Обратите внимание, что порядок поддерживается
отсортированный набор (явный или нет
компаратор предоставляется) должен быть
в соответствии с равенством, если отсортировано
набор для правильной реализации набора
интерфейс. (См. Сравнительный
интерфейс или интерфейс компаратора для
точное определение последовательного
с равными.) Это так, потому что
Заданный интерфейс определяется в терминах
операция равенства, но отсортированная
set выполняет все сравнения элементов
используя его сравнить (или сравнить)
метод, поэтому два элемента, которые
считаются равными по этому методу, из
точка зрения отсортированного набора,
равны. Поведение отсортированного набора
четко определены, даже если его порядок
несовместимый с равными; это просто
не соблюдает общий договор
Заданный интерфейс.
Я выделил последнее предложение. Дело в том, что такой SortedSet будет работать так, как вы, скорее всего, ожидаете, но поведение некоторых операций не будет точно соответствовать спецификации Set
... потому что спецификация определяет их поведение в терминах метода equals
.
Так что на самом деле является заявленным требованием согласованности (моя ошибка), но последствия его игнорирования не так плохи, как вы думаете. Конечно, решать, стоит ли вам это делать. По моей оценке, все должно быть в порядке, при условии, что вы тщательно прокомментируете код и убедитесь, что SortedSet не «просачивается».
Однако мне не ясно, что Comparator для коллекций, который рассматривает только «размер» коллекций, будет работать ... с семантической точки зрения. Я имею в виду, вы действительно хотите сказать, что все коллекции с (скажем) 2 элементами равны? Это будет означать, что ваш набор может содержать только одну коллекцию любого заданного размера ...