2013-03-30 1 views
4

다음은 개체 목록에서 중복 개체를 찾는 코드입니다. 그러나 어떤 이유로 해시 세트는 동일한 객체를 저장하고 있습니다.동일한 개체를 저장하는 HashSet

Dog 클래스를 여기에 나는 확실히 여기에 뭔가를 놓친 거지하지만 난 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

이 코드는하지 않습니다 HashSet의 사용 무엇 Object.equals를 오버라이드 (override) 아니에요

public boolean equals(Dog d){ 
    return this.size.equals(d.size); 
} 

: 당신이 그것을 필요. 당신이해야 할 다음 @Override 주석을 사용하여, 당신은 에 컴파일러는 당신이 실제로하는 방법을 무시하고을 확인 요구하고 있다는

@Override 
public boolean equals(Object d){ 
    if (!(d instanceof Dog)) { 
     return false; 
    } 
    Dog dog = (Dog) d; 
    return this.size.equals(dog.size); 
} 

참고.

편집 : 언급 한 바와 같이, 당신은 또한equals 방법과 호환되는 방식으로 hashCode를 오버라이드 (override) 할 필요가있다. 당신은 크기에 따라 평등을 확인하고 있음을 감안할 때, 가장 간단한 방법은 다음과 같습니다 또한 영업 이익에서

@Override 
public int hashCode() { 
    return size.hashCode(); 
} 
+0

은 그가 지금처럼 같은 크기의 서로 다른 두 개는 서로 다른 해시 코드를 가지고 있기 때문에, 다른'hashCode'을 무시한다. OP가 개 크기에 대해 하나의 문자열을 사용하는 것처럼 보이는 한 가지 가능성은'return size.charAt (0);' – halex

+0

@halex : Yup을 사용하는 것입니다. 편집 할 것입니다. (하지만 나는 단지'charAt (0)'을 사용하지 않을 것입니다 ... size 해시 코드를 사용할 수도 있습니다 ...) –

+0

'size' 해시 코드를 사용하는 솔루션이 더 좋습니다. :). +1 – halex