我想使用HashMap来帮助计算pair元素的数量。 这里我有一个类 Pair 如下:
class Pair{
String s1;
String s2;
Pair(String ss1,String ss2) {
s1 = ss1;
s2 = ss2;
}
public int hashCode(){
Integer a = Integer.valueOf(s1);
Integer b = Integer.valueOf(s2);
return 31 * a + b;
}
public boolean equals(Pair c) {
if (c == null) return false;
if (this.s1.equals(c.s1) && this.s2.equals(c.s2)) return true;
return false;
}
}
我将 Pair 类应用于 HashMap
HashMap<Pair,Integer> map1 = new HashMap<Pair,Integer>();
while (...) {
Pair p = new Pair(word, lastword);
if (map1.get(p) == null) {
map1.put(p,0);
}
map1.put(p,map1.get(p)+1);
}
虽然我在 Pair 类中定义了 hashCode 和 equals 函数。我的代码 map1.get(p) == null 始终为 true,就好像 map 从未看到具有两个相同字符串的对一样。 最后输出为:
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
而不是
7 , 2 : 7
这意味着我的 map 将每对(“7”,“2”)视为不同的对,尽管它们具有相同的哈希码。
谁能告诉我在 Pair 类的设计中哪里做错了?
谢谢。
最佳答案
您的equals()
方法不会覆盖Object.equals()
。正确的签名是
@Override
public boolean equals(Object o)
请注意 @Override
的使用,它告诉编译器您的意图是重写方法。如果您实际上没有重写一个(就像您的代码中的情况一样),编译器将拒绝编译,因此您将检测到您的签名不正确。
此外,如果 s1
和 s2
应该始终表示整数,那么它们的类型应该是 int
,而不是 String
.
关于java - HashMap 的用户定义键类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26322519/