Java Hashtable .containsKey (строковый ключ) возвращает true, даже если строки и хэш-коды отличаются ... Как? - PullRequest
1 голос
/ 12 апреля 2011

В настоящее время у меня есть некоторые проблемы с моим Hashtable в Java, где FEightPuzzle - это класс, который я создал.

Внутри моего класса у меня есть строка, в которой хранится ключ для каждого экземпляра.Теперь во время моей программы, когда я проверяю внутри Hashtable наличие дубликатов, я иногда «нахожу» некоторые, когда действительно найденные экземпляры отличаются.

Возьмем, например, когда я вызываю bol.containsKey (current.key), где bolHT и текущий это FEightPuzzle.

Когда это так, я проверяю значения ключей, и они

current.key =
"8 14 11 0 6 12 13 1 10 4 5 9 15 2 3 7"

bol.get(current.key).key =
"12 8 4 0 13 9 5 1 14 10 6 2 15 11 7 3"

со значениями

current.key.hashCode() = -950607924

bol.get(current.key).key.hashCode() = -1856769042

Извините, что беспокою вас, но эта проблемадействительно до меня доходит, и это было последнее, чего я ожидал сегодня вечером, чтобы быть честным (не любите это) ... Любые намеки или ответы будут с благодарностью!

Ответы [ 2 ]

5 голосов
/ 12 апреля 2011

Я перечитал ваш вопрос, и, насколько я понимаю, у вас есть следующая проблема:

Вы делаете

bol.containsKey(current.key)

чтобы проверить, есть ли current в bol.

Когда он возвращает true, вы ожидаете, что значение, сопоставленное с current.key, действительно должно быть current, но, как показывают ваши хэш-коды, это не так.

Возможно, проблема в следующем:

  1. Во-первых, вы неправильно поместили объект головоломки в хеш-таблицу.

    Вы должны сделать

    bol.put(somePuzzle.key, somePuzzle)
    
  2. Вы изменили ключ, когда загадка была на карте. ЭТО НЕ РАЗРЕШЕНО.

    После добавления записи на карту вы не можете изменить ключ без удаления / повторной вставки сопоставления.

    Hashtable будет искать объект, основываясь на ключе, который вы указали при вставке.

  3. Вы случайно предоставили один и тот же ключ для нескольких различных объектов головоломки (в этом случае один put заменит предыдущий)


Одним из предложений было бы позволить FEightPuzzle переопределить hashCode и equals и использовать HashSet вместо Hashtable.

0 голосов
/ 12 апреля 2011

Я думаю, возможно, вы не понимаете, что делает Hashtable.Он сопоставляет ключи со значениями.Поэтому вызов get(key) на вашем ключе вернет значение, которое вы указали с put(key, value).Теперь, если вы всегда вводите одно и то же значение в качестве ключа, вам следует ожидать одного и того же, однако в этом случае все, что вам нужно, это HashSet.Если вы вводите одинаковые значения для разных ключей, это будет разрешено.Только ключи являются уникальными в HashtableHashMap одинаково).

...