我目前在java中使用Hashtable存在一些问题,其中FEightPuzzle是我创建的一个类。
在我的类中,我有一个String,它存储每个实例的密钥。现在,在我的程序中,当我在Hashtable中检查重复的实例时,我有时会“找到”一些真正找到的实例。
例如,当我调用bol.containsKey(current.key)时,bol是HT,current是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
我很抱歉打扰你,但这个问题真的让我感到高兴,这是我今晚要做的最后一件事是诚实的(你不喜欢那样)......任何提示或答案都将不胜感激!
答案 0 :(得分:5)
我已经重读了您的问题,据我了解,您遇到以下问题:
你做
bol.containsKey(current.key)
检查current
中是否已bol
。
当它返回true时,您希望current.key
映射到的值确实应该是current
,但正如您的哈希码所示,它不是。
问题可能是以下之一:
您没有将拼图对象放在哈希表中。
你应该做
bol.put(somePuzzle.key, somePuzzle)
当拼图在地图中时,您更改了密钥。这是不允许的。
在地图中添加条目后,如果不删除/重新插入地图,则可能无法更改密钥。
Hashtable将根据您在插入时提供的密钥查找对象。
您不小心为多个不同的拼图对象提供了相同的密钥(在这种情况下,一个put
将覆盖前一个
一个建议是让FEightPuzzle覆盖hashCode和equals并使用HashSet而不是Hashtable。
答案 1 :(得分:0)
我想也许你误解了Hashtable
的作用。它将键映射到值。因此,在密钥上调用get(key)
将返回您使用put(key, value)
提供的值。现在,如果你总是把相同的值作为键,你应该期望相同的东西,但是在这种情况下你只需要HashSet
。如果你为不同的密钥输入相同的值,它将允许这样做。只有密钥在Hashtable
中是唯一的(HashMap
是相同的)。