Java: внешний класс для определения эквивалентности?
Java имеет Comparator<T>
для обеспечения сравнения объектов, внешних по отношению к самому классу, для обеспечения нескольких / альтернативных методов выполнения упорядоченных сравнений.
Но единственным стандартным способом неупорядоченных сравнений является переопределение equals()
в классе.
Что мне делать, если я хочу предоставить несколько / альтернативных неупорядоченных сравнений, внешних по отношению к классу? (Очевидный вариант использования - разбиение коллекции на классы эквивалентности на основе определенных свойств.)
Предполагая, что конечное использование предназначено для неупорядоченной проверки (например, не для сортировки или индексации), можно ли это реализовать Comparator<T>
это просто проверяет равенство, возвращая 0, если два объекта равны, и значение!= 0, если два объекта неравны? (примечание: единственная причина, по которой я не использую это решение, заключается в том, что технически Comparator
не предоставляя отношения, которое удовлетворяет транзитивности и симметрии.)
Кажется, должно было быть EqualsComparator<T>
стандартный класс или что-то.
(Гуава обрабатывает что-нибудь подобное?)
1 ответ
Да, гуава имеет Equivalence
интерфейс и Equivalences
класс (удалено в версии 14.0 для Guava).
(И да, это то, что очень полезно и, к сожалению, отсутствует в Java. У нас действительно должны быть варианты для этого HashMap
, HashSet
так далее...)
В то время как Comparator<T>
может быть хорошо в некоторых ситуациях, это не обеспечивает hashCode
метод, который будет важен для коллекций на основе хеша.