2013-09-24 58 views
19

代碼:如何消除Guava MultiMap值中的重複項?

Multimap<String, String> myMultimap = ArrayListMultimap.create(); 
    myMultimap.put("12345", "qwer"); 
    myMultimap.put("12345", "abcd"); 
    myMultimap.put("12345", "qwer"); 
    System.out.println(myMultimap); 

結果:

{12345=[qwer, abcd, qwer]} 

是否有可能消除重複 「QWER」? 謝謝。

回答

29

使用SetMultimap實現之一,例如HashMultimap

SetMultimap<String, String> myMultimap = HashMultimap.create(); 
myMultimap.put("12345", "qwer"); 
myMultimap.put("12345", "abcd"); 
myMultimap.put("12345", "qwer"); 
System.out.println(myMultimap); // {12345=[abcd, qwer]} 
+3

作爲文檔狀態,由於相同的原因,對集合的引用很少優於集合,列表等,因此對計劃Multimap的引用很少優於其中一個子接口。分配的LHS應該是SetMultimap。 – gk5885

+1

@ gk5885好點,代碼已更新。 – gustafc

12

A ListMultimapArrayListMultimap允許重複的鍵值對。嘗試執行SetMultimap,例如HashMultimapTreeMultimap

+1

@StormeHawke除了它不太可讀。 – gustafc

+2

@StormeHawke當我讀它時,我不必眨眼,但它肯定會傷害看。事情是,當你一年後回來維護這個代碼時,你必須弄清楚這個特定的車輪是如何改造的。它是否包含沒有值的鍵的空集?如果是這樣,那麼所有*期望的鍵都有空值,還是隻有一些?價值觀中會有空位嗎?然後你開始詛咒原作者(「該死的你,過去我!」),因爲它沒有使用具有明確定義的合同和意圖的集合,即multimap。 – gustafc

0

有很多方法可以做到這一點。最簡單的方法是使用SetMultimap

但是,只有您提供的示例的JDK解決方案只是簡單地使用Map<String, Set<String>>,它將具有唯一值的唯一密鑰Set

Map<String, Set<String>> map = new HashMap<String, Set<String>>(); 

使用的是你沒有在數據結構,使外部庫,你嚴格使用Java核心庫的優勢。

+1

很高興看到普通的Java解決方案。 –

+0

@SilviuBurcea'MultiMap's有它們的位置,但是我的經驗對他們的需求是非常罕見的...我從來沒有必要一直使用其中一個我一直在編程 – StormeHawke

+1

我想所有的谷歌玩家都不會不喜歡我純粹的Java解決方案......只有理由我可以看到一個完全有效的答案 – StormeHawke