2013-08-06 15 views
1

我用TreeMultiset嘗試了下面的代碼。似乎丟棄了「* Twin」條目並且重複的數量存儲在TreeMultiset中。我想這是一個功能,而不是一個錯誤。有沒有一個對象存儲每個對象而不是一個鍵和一個重複計數?TreeMultiset是否只保存每個鍵的重複次數?

public class Guava { 

    public static class Obj implements Comparable<Obj> { 

     String name; 
     int age; 

     public Obj(String name, int age) { 
      this.name = name; 
      this.age = age; 
     } 

     @Override 
     public String toString() { 
      return String.format("%[email protected]%d", name, age); 
     } 

     @Override 
     public int compareTo(Obj o) { 
      return Integer.compare(age, o.age); 
     } 
    } 

    public static void main(String[] args) { 
     TreeMultiset<Obj> tree = TreeMultiset.create(); 
     tree.add(new Obj("Ajo", 37)); 
     tree.add(new Obj("AjoTwin", 37)); 
     tree.add(new Obj("Ari", 31)); 
     tree.add(new Obj("AriTwin", 31)); 
     tree.add(new Obj("Fly", 1)); 
     System.out.println(tree.size()); 
     for (Obj obj : tree) { 
      System.out.println(obj); 
     } 
    } 
} 
+0

如果你想要一個集合保持多個「相等」的元素,你不應該使用'Set'。您可能想考慮使用「equals」的正常實現,並使用「Equivalence」來表示同一年齡段的行爲。 –

回答

1

我們只知道可以肯定的是:

MultiSet-Docu:注意Multiset<E>不是Map<E, Integer>,雖然這可能是一個Multiset實施的一部分。 Multiset是真實的Collection類型,並滿足所有相關的合同義務。

這意味着,MultiSet或多或少是一個Set(它沒有實現Set)也計算。並且Set不包含重複的元素。

一個真正的Set也保持你插入的第一個元素,並丟棄任何進一步相等的元素。

Set#add(E):如果此集合已包含該元素,則該調用將使該集合保持不變並返回false。

由於TreeMultiSet使用compareTo而不是equals你必須與你得到的結果告終。

注意:您應該實現.equals模擬.compareTo

TreeMultiSet-Docu:由可比類說明書中解釋的比較,必須與equals一致。否則,由此產生的multiset將違反按照Object.equals(java.lang.Object)指定的Collection合同。


如果你想要的東西,可以存儲多個要素嘗試(List)MultiMap。這基本上是一個Map<Key, List<Value>>,如果它們具有相同的密鑰,它會自動將元素添加到列表中。

3

如果你是說兩個對象是平等的,但不是真的相等,這必然會導致混淆。在這種情況下,我會使用Obj列表列表。

對於你的例子,如果你改變了比較,你可以使用TreeSet,但我想你可以用整數查找。在這種情況下,您可以使用TreeMultimap。

相關問題