[英]HashSet storing equal objects
下面是從對象列表中查找重復對象的代碼。 但由於某種原因,hashset甚至存儲了相等的對象。
我肯定錯過了一些東西,但是當我檢查hashset的大小時,它出來了5。
import java.util.ArrayList;
import java.util.HashSet;
public class DuplicateTest {
public static void main(String args[]){
ArrayList<Dog> dogList = new ArrayList<Dog>();
ArrayList<Dog> duplicatesList = new ArrayList<Dog>();
HashSet<Dog> uniqueSet = new HashSet<Dog>();
Dog a = new Dog();
Dog b = new Dog();
Dog c = new Dog();
Dog d = new Dog();
Dog e = new Dog();
a.setSize("a");
b.setSize("b");
c.setSize("c");
d.setSize("a");
e.setSize("a");
dogList.add(a);
dogList.add(b);
dogList.add(c);
dogList.add(d);
dogList.add(e);
if(a.equals(d)){
System.out.println("two dogs are equal");
}
else System.out.println("dogs not eqal");
for(Dog dog : dogList){
uniqueSet.add(dog);
}
System.out.println("number of unique dogs="+ uniqueSet.size());
/*for(Dog dog:uniqueSet){
System.out.println("uniqueset ="+dog.getSize());
}
for(Dog dog : duplicatesList){
System.out.println("duplicate dog="+dog.getSize());
}*/
}
}
這是狗類
public class Dog implements Animal, Comparable<Dog>{
String size;
public void makeNoise(){
System.out.println("woof woof");
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public int compareTo(Dog d){
return this.size.compareTo(d.size);
}
public boolean equals(Dog d){
return this.size.equals(d.size);
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
}
此代碼不能滿足您的需要:
public boolean equals(Dog d){
return this.size.equals(d.size);
}
這不是重寫Object.equals,這是HashSet使用的。 你需要:
@Override
public boolean equals(Object d){
if (!(d instanceof Dog)) {
return false;
}
Dog dog = (Dog) d;
return this.size.equals(dog.size);
}
請注意,通過使用@Override
注釋,您要求編譯器驗證您實際上是否覆蓋了方法。
編輯:如上所述,您還需要以與equals
方法兼容的方式覆蓋hashCode
。 鑒於您根據大小檢查相等性,最簡單的選項是:
@Override
public int hashCode() {
return size.hashCode();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.