2013-03-30 57 views
4

下面是从对象列表中查找重复对象的代码。但由于某些原因,哈希集正在存储相同的对象。存储相同对象的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(); 
} 
} 

回答

8

此代码不会做你需要它:

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(); 
} 
+0

除了OP具有覆盖'hashCode'不同,因为他现在做相同大小两个不同的狗有不同的哈希码。由于OP似乎使用一个字符字符串作为狗的大小,所以可能会使用'return size.charAt(0);' – halex

+0

@halex:Yup,但没有发现它。将编辑。 (但我不会只是'charAt(0)'...不如使用大小的哈希码......) –

+0

只需使用'size'的哈希码就可以解决问题,我不得不承认:)。 +1 – halex