java - HashMap 的用户定义键类

标签 java hash

我想使用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 的使用,它告诉编译器您的意图是重写方法。如果您实际上没有重写一个(就像您的代码中的情况一样),编译器将拒绝编译,因此您将检测到您的签名不正确。

此外,如果 s1s2 应该始终表示整数,那么它们的类型应该是 int,而不是 String.

关于java - HashMap 的用户定义键类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26322519/

相关文章:

java - 如何确定 Java 泛型方法中的类型?

hash - 计算哈希值有多快?

javascript - 编辑 window.location.hash 将导致删除查询字符串

javascript - 如何使用 Javascript 从地址栏中获取哈希之前的所有内容?

JavaFX:用线程移动一个圆圈

未找到 Java 包 : Compiling with CPlex from command line

Java:记住处理哪些对象的有效方法

hash - tumblr 图片 url 中的哈希值是如何生成的?

java - 将毫秒转换为分和秒?

java - 异步远程服务没有定义对应的方法