2012-05-18 4 views
1

아티팩트라는 개체의 TreeSet이 있습니다. 그래서 같은 객체의 등호 및 해시 코드 메소드를 오버라이드 (override) 한 : 나는 equals 메소드에 지문을 넣어하고이 호출되지고유 한 값을 저장하지 않는 Java TreeSet

@Override 
public int hashCode() { 
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers 
     // if deriving: appendSuper(super.hashCode()). 
     append(artifactId). 
     toHashCode(); 
} 

@Override 
public boolean equals(Object arg0) { 

    Artifact obj=(Artifact)arg0; 

    if(this.getArtifactId().equalsIgnoreCase(obj.getArtifactId())) 
    { 

      return true; 
    } 

    return false; 
} 

. 나는 TreeSet의 그것 등호 오버라이드 (override)에 따라 고유성의 설정 읽었습니다

TreeSet<Artifact> syncedList = new TreeSet<Artifact>(new ArtifactComparator()); 

: 나는처럼 보이는 비교기로 TreeSet의 인스턴스를 생성했다.

내가 필요로하는 것과 같이 고유하지 않은 TreeSet의 ArtifactId가 동일한 여러 개체가 표시됩니다.

내 같음 및 해시 코드 메소드에 누락 된 것이 있습니까? 당신이 entrySet() 또는 keySet()를 가져 오는 경우를 제외하고

답변

2

Ernest가 말했듯이 compareTo() 메서드가 필요합니다. Tree 구조에 대해 생각해 보면, 두 객체가 서로 같다고 생각할 필요는 없지만 하나가 "less than"또는 "greater than"이면 객체를 배치 할 트리의 위치를 ​​알 수 있습니다. 이미있는 것들. 즉, 으로 정렬 된 트리를 만듭니다.

@Override 
public int compareTo(Object arg0) { 
    Artifact obj=(Artifact)arg0; 
    return this.getArtifactId().compareToIgnoreCase(obj.getArtifactId()); 
} 
: 같은 아래로 compareTo 방법을 추가,

그래서, 당신은 멀리 당신이 원하는 경우 ArtifactComparator 클래스로 할 수 있고, 당신의 유물 클래스는 Comparable<Object>를 구현하기

1

TreeMap (이 TreeSet는) 전혀 equals() 방법을 사용하지 않습니다. 문제가 있다면, 클래스의 compareTo()Artifact의 평등을 나타 내기 위해 0을 반환해야 ArtifactComparator.에있을 것입니다.

관련 문제