我已经为此类编写了一个hashcode
函数,但出于某种原因,hashmap 无法正确识别HashMap
中实际存在键的时间。 (坐标是一个字符串)
@Override
public int hashCode() {
return coordinates.hashCode();
}
并且我还为用于测试两对坐标是否彼此相等的类编写了一个.equals
方法;但是,为了验证我的哈希码方法是否正常工作,我已将 .equals
方法切换为以下方法。
public boolean equals(Object arg) {
Block a = (Block) arg;
return hashCode() == a.hashCode();
}
它们都在别处通过 hashmap.containskey()
调用调用,如下所示:
return (hashblocks.containsKey(newz));
出于某种原因,这只会返回 true ~ 50% 的时间应该返回(我们甚至重新输入完全相同的情况,有时它有效,有时却无效)我在过去尝试时遇到了很多问题get 包含为 HashMap
和 Set
正常工作的方法,我想知道为什么这个实现特别有困难。 (基本上,错误可能是什么)
3 1 3 1
true
4 2 4 2
false
0 0 1 0
0 3 1 3
2 0 3 0
2 3 3 3
0 1 1 2
2 1 2 2
4 0 4 0
4 2 4 2
3 1 3 1
3 2 3 2
3 1 3 1
true
4 2 4 2
true
3 2 3 2
true
0 0 1 0
0 3 1 3
2 0 3 0
3 3 4 3
0 1 1 2
2 1 2 2
4 0 4 0
4 2 4 2
3 1 3 1
3 2 3 2
查询后跟它的结果,一长串数字表示所有键后跟一个换行符
最佳答案
to verify that my hashcode method is working correctly I've switched the .equals method to the following.
return hashCode()==a.hashCode();
这仅在“完美散列”的情况下有效,即当散列码相等意味着实际值相等时。 Java 中String
的哈希码并不完美(事实上,即使在理论上,它们也不可能对所有可能的字符串都是完美的)。
您需要使相等性检查与哈希码保持一致 - 在您的情况下,这将检查 坐标
的相等性:
public boolean equals(Object arg) {
Block a = (Block) arg;
return coordinates.equals(a.coordinates);
}
关于java - 哈希码未正确哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25340143/