2009-12-28 4 views
3

У меня есть несколько наборов, которые хранят объекты одного и того же класса, но я хочу указать для каждой из них другую функцию идентификации (например, в одном наборе A == B, если Ax == Bx, а в другом A == B, если Ay == By).Определение мульчированных хэш-функций для одного и того же объекта

В настоящее время я использую TreeSets с различными компараторами, определенными для каждого. Мне интересно, как можно сделать то же самое, если я хочу переключиться на HashSets. Java не позволяет передавать отдельную хеш-функцию таким же образом, что позволяет сравнивать компараторы для сортированных/древовидных коллекций. Единственный способ, с помощью которого я могу это сделать, - это создать другой класс-оболочку и реализовать метод hashCode() для каждого из элементов каждого HashSet. Есть ли лучший способ сделать это?

ответ

2

Вы можете попробовать использовать THashSet в GNU Trove, Это поддерживает несколько стратегий хэширования.

7

Как насчет создания отдельных подклассов для каждого набора. Единственным отличием для каждого подкласса была бы переопределенная хеш-функция, соответствующая вашим критериям.

+3

Вы можете реализовать подклассы как частные внутренние классы и предоставить фабричный метод для получения семантики равенства, которую вы хотите. Это инкапсулирует выбор полностью – Andrew

3

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

Вы упомянули о внедрении метода hashCode - не забудьте также реализовать equals.

2

Существует еще один вариант: Вы можете скопировать исходный код для HashMap и заменить метод hash(Object key) с чем-то еще (например, вызов к Hasher, который работает как Comparator в TreeMap).

+0

хорошо. Не забудьте реализовать интерфейс Collection. – Bozho

+0

Спасибо. Думаю, это лучшее, что нужно сделать. Я принимаю ответ Питера Лори, так как он предлагает использовать встроенную реализацию вместо того, чтобы кодировать мою собственную. – MAK

Смежные вопросы