2015-02-27 4 views
0

У меня есть объект MultiKey в качестве ключей для Карты.Java: Карта с типом doubleKey, как сделать правильный hashCode()?

Ключ состоит из имени (строки) и идентификатора (int).

Следующие контракты должны быть заполнены: Ключи должны быть равны, если либо имена обеих ключей равны, либо идентификаторы обоих ключей.

Как мне реализовать функцию hashCode(), чтобы этот контракт не был нарушен? Возможно ли это?

Внедрение равно легко ... я просто положить:

if (name.equals(other.name) || id == other.id) 
    return true; 

Но это не будет работать, потому что HashMap использует только хэш-код(), и не заботится о равных() ...

Пример:

Map A = [ ("tom",1)=TOMAS, ("eli",2)=ELIAS ] 

A.get(new Key("tom",0)) should return TOMAS 
A.get(new Key("",1))  should return TOMAS 
A.get(new Key("eli",2)) should return ELIAS 
... 
+4

Как насчет 'A.get (новый ключ (" tom ", 2))'? – Tunaki

+0

Нет, это точка. Два ключа должны быть одинаковыми, если либо имена ИЛИ идентификаторы равны – Jan

+3

Я понял, что, но учитывая вашу карту 'A', что' A.get (новый ключ («tom», 2)) 'должен вернуться? – Tunaki

ответ

1

О единственном способе, которым я могу это сделать, это создать набор для TreeSet для кэширования хэш-кодов для ключей. Затем используйте первое значение equals, которое встречается как значение hashCode для текущего выполнения. Проблемы с этим:
a. Можно использовать много дополнительной памяти, если есть много разных ключей.
b. Значения hashCode не обязательно будут согласованы между несколькими запусками программы.
c. Если многопоточность, требуется синхронизация с кэшированными хэш-кодами.

Если вы сделаете это, hashCode может быть просто сгенерирован, комбинируя имя и идентификатор, как всегда.

0

наихудший сценарий: всегда возвращает тот же хэш-код. specs скажем вкратце: - если 2 объекта равны, они должны иметь одинаковый хэш-код. Если 2 объекта неравны, они все равно могут иметь один и тот же хэш-код. Хеш-код существует, прежде всего, для производительности.

+1

. Пока это работает, он делает паршивый HashMap. Если вы это сделаете, вместо этого используйте TreeMap. – user3745362

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