Java: внешний класс для определения эквивалентности?

Java имеет Comparator<T> для обеспечения сравнения объектов, внешних по отношению к самому классу, для обеспечения нескольких / альтернативных методов выполнения упорядоченных сравнений.

Но единственным стандартным способом неупорядоченных сравнений является переопределение equals() в классе.

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

Предполагая, что конечное использование предназначено для неупорядоченной проверки (например, не для сортировки или индексации), можно ли это реализовать Comparator<T> это просто проверяет равенство, возвращая 0, если два объекта равны, и значение!= 0, если два объекта неравны? (примечание: единственная причина, по которой я не использую это решение, заключается в том, что технически Comparator не предоставляя отношения, которое удовлетворяет транзитивности и симметрии.)

Кажется, должно было быть EqualsComparator<T> стандартный класс или что-то.

(Гуава обрабатывает что-нибудь подобное?)

1 ответ

Решение

Да, гуава имеет Equivalence интерфейс и Equivalences класс (удалено в версии 14.0 для Guava).

(И да, это то, что очень полезно и, к сожалению, отсутствует в Java. У нас действительно должны быть варианты для этого HashMap, HashSet так далее...)

В то время как Comparator<T> может быть хорошо в некоторых ситуациях, это не обеспечивает hashCode метод, который будет важен для коллекций на основе хеша.

Другие вопросы по тегам