我将整数对类设置如下:
public class pair{
int a;
int b;
pair(int p,int q){
this.a=p;
this.b=q;
}
}
当我将它们添加到hashset时,没有重复项:
HashSet<pair> set=new HashSet<pair>();
pair temp=new pair(3,5);
set.add(temp);
pair temp1=new pair(3,5);
set.add(temp1);
for(pair p:set){
System.out.println(p.a+" "+p.b);
}
但它给了我这个输出:
3 5
3 5
我应该编辑什么才能在hashset中没有重复?
答案 0 :(得分:6)
你必须做两件事:
equals()
hashCode()
正如hashCode()
的javadoc告诉你的那样,它必须与equals()
一致,即如果两个对象是等号,它们应该具有相同的hashCode。两个不相等的对象可以使用相同的hashCode,
这样的事情:
public class pair{
int a;
int b;
pair(int p,int q){
a=p;
b=q;
}
public boolean equals(Object o) {
if (o instanceof Pair) {
Pair p = (Pair)o;
return p.a == a && p.b == b;
}
return false;
}
public int hashCode() {
return new Integer(a).hashCode() * 31 + new Integer(b).hashCode();
}
}
答案 1 :(得分:2)
您需要覆盖对类的等于方法,专门查看每对,看看它们是否匹配。
编辑:是的,哈希码方法也必须被覆盖
答案 2 :(得分:2)
您应该覆盖该类的hashCode
和equals
方法才能使其生效。这样做是为了纪念hashCode并等于Java中对象的契约。