以下是查找对象列表中重复对象的代码。但由于某些原因,HashSet 甚至存储了相等的对象。
我肯定在这里漏掉了一些东西,但当我检查 HashSet 的大小时,它显示为 5。
我肯定在这里漏掉了一些东西,但当我检查 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());
}*/
}
}
这里是 Dog 类
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();
}
}
hashCode
,因为现在他所做的是两个大小相同的不同狗具有不同的哈希码。由于OP似乎使用一个字符字符串表示狗的大小,因此一种可能性是使用return size.charAt(0);
。 - halexcharAt(0)
...最好使用大小哈希码...) - Jon Skeetsize
的哈希码的解决方案确实更好,我不得不承认:)+1 - halexHashSet
。提示在于Hash
这个部分 :) 如果你使用了TreeSet
,它会使用compareTo
...但是你正在使用基于普通相等性/哈希的HashSet
。(而且调用hashCode
的不是编译器,而是HashSet
内部的代码。) - Jon Skeet