用户定义的HashMap密钥类

时间:2014-10-12 06:28:53

标签: java hash

我想使用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类的设计中我做错了吗?

感谢。

1 个答案:

答案 0 :(得分:2)

您的equals()方法未覆盖Object.equals()。正确的签名是

@Override
public boolean equals(Object o)

请注意使用@Override,它告诉编译器您的意图是要覆盖方法。如果你实际上没有覆盖一个(如代码中的情况),编译器将拒绝编译,因此您将检测到您的签名不正确。

此外,如果s1s2应始终代表整数,则其类型应为int,而不是String