我想使用HashMap来帮助计算一对元素的数字。 在这里,我有一个类对如下:
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,就好像地图永远不会看到具有两个相同字符串的对。 最后,输出是:
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
7 , 2 : 1
而不是
7 , 2 : 7
这意味着我的地图会将每对(&#34; 7&#34;,&#34; 2&#34;)视为不同的对,尽管它们具有相同的哈希码。
有人能告诉我在Pair类的设计中我做错了吗?
感谢。
答案 0 :(得分:2)
您的equals()
方法未覆盖Object.equals()
。正确的签名是
@Override
public boolean equals(Object o)
请注意使用@Override
,它告诉编译器您的意图是要覆盖方法。如果你实际上没有覆盖一个(如代码中的情况),编译器将拒绝编译,因此您将检测到您的签名不正确。
此外,如果s1
和s2
应始终代表整数,则其类型应为int
,而不是String
。