2012-05-18 24 views
1

我有一個名爲Artifacts的對象的TreeSet。我已經覆蓋了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; 
} 

我已經把打印的equals方法,它永遠不會被調用。我已經用一個比較器實例化TreeSet,如下所示:

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

我讀過TreeSet根據等於重寫確定它的唯一性。

我看到TreeSet中具有相同ArtifactId的多個對象,並非像我需要的那樣是唯一的。

在我的等號和散列碼方法中缺少一些東西嗎?

回答

2

正如歐內斯特所說,您需要一個compareTo()方法。如果您考慮樹結構,它不僅需要知道兩個對象是否彼此相等,但是如果其中一個「小於」或「大於」以知道樹中將對象放置在何處相對於那些已經在那裏。即樹構建了訂購的列表。

所以,你可以破除,如果你想在ArtifactComparator類,只是讓你的神器類實現Comparable<Object>,加入compareTo方法如下面:

@Override 
public int compareTo(Object arg0) { 
    Artifact obj=(Artifact)arg0; 
    return this.getArtifactId().compareToIgnoreCase(obj.getArtifactId()); 
} 
1

TreeMap(這TreeSet)不使用你的equals()方法可言,除非你獲取entrySet()keySet()。如果出現問題,將出現在ArtifactComparator.該類的compareTo()必須返回0以指示兩個Artifact是相等的。