假设我有一个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设置自定义数据对象吗?我错过了什么?感谢...
答案 0 :(得分:1)
您应该覆盖MyKey类中的equals()
和hashcode()
方法(或任何其他自定义类,以便进入HashMap或Set)。这样,当您说containsKey()
(或设置方法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)
答案 1 :(得分:0)
在您的System.out中,您正在生成new MyKey()
。您想要检查您的散列图是否包含MyKey(1,1234)
,而不是new MyKey(1,1234)
。