0

假设,我有一个 HashMap:

HashMap<MyKey, Integer> HM = new HashMap<MyKey, Integer>();

MyKey 对应于具有两个整数元素的数据对象(以及用于传递两个整数的构造函数)。

HM.put(new MyKey(1,1234), 1); // this seems to work...

但是,我似乎无法使用它:

System.out.println(HM.containsKey(new MyKey(1,1234)));

我弄错了。

HashMap 可以为 Key 提供自定义数据对象吗?我错过了什么?谢谢...

4

2 回答 2

1

您应该覆盖MyKey 类(或任何其他将进入 HashMap 或 Set 的自定义类)中的equals()and方法。hashcode()这样,当您说containsKey()(或 Set 方法contains(),或equals())时,您将明确指定 MyKey 的哪些属性来检查包含或相等性。

您可以在 MyKey 类中使​​用这样equals()的简单方法hashCode()

@Override
public boolean equals(Object o) {
    boolean result = false;
    if (o instanceof MyKey) {
        MyKey mykey = (MyKey) o;
        result = (this.getX() == mykey.getX() && mykey.getY() == mykey.getY());
    }
    return result;
}

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + X;
        result = prime * result + Y;
        return result;
    }

(假设 MyKey 类中的字段是 X 和 Y)

于 2013-05-03T15:17:39.507 回答
0

在您的 System.out 中,您正在生成一个new MyKey(). 您想检查您的哈希图是否包含 a MyKey(1,1234),而不是 a new MyKey(1,1234)

于 2013-05-03T15:14:10.217 回答