2013-09-24 7 views
19

Code:Wie werden Duplikate in Guava MultiMap-Werten eliminiert?

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

Ergebnis:

{12345=[qwer, abcd, qwer]} 

Ist es möglich, doppelte "qwer" zu beseitigen? Danke.

Antwort

29

Verwenden Sie eine der SetMultimap Implementierungen, zB 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

Wie der Dokumentationszustand angibt, wird eine Referenz auf einen Plan Multimap aus den gleichen Gründen selten vor einer der Subschnittstellen bevorzugt, dass Verweise auf Collection gegenüber Set, List usw. selten bevorzugt werden. Der LHS der Zuweisung sollte ein SetMultimap sein. – gk5885

+1

@ gk5885 Guter Punkt, Code aktualisiert. – gustafc

12

Ein ListMultimap wie ArrayListMultimap ermöglicht doppelte Schlüssel/Wert-Paare. Versuchen Sie eine Implementierung von SetMultimap wie HashMultimap oder TreeMultimap.

+1

@StormeHawke, außer dass es weniger lesbar wäre. – gustafc

+2

@StormeHawke Ich muss nicht blinzeln, wenn ich es lese, aber es tut weh, wenn ich es ansehe. Das ist, wenn Sie ein Jahr später zurückkommen, um diesen Code zu behalten, müssen Sie herausfinden, wie dieses spezielle Rad neu erfunden wurde. Enthält es leere Mengen für Schlüssel ohne Werte? Wenn ja, gibt es leere Werte für * alle * erwarteten Schlüssel oder nur für einige? Wird es unter den Werten Nullen geben? Und dann fängst du an, den ursprünglichen Autor zu verfluchen ("Verdammt, an mir!"), Dass er keine Sammlung mit einem klar definierten Vertrag und Absicht verwendet, d. H. Multimap. – gustafc

0

Es gibt viele Möglichkeiten, dies zu tun. Am einfachsten wäre es, eine SetMultimap zu verwenden.

Eine JDK einzige Lösung mit Ihrem gegebenen Beispiel wäre jedoch, einfach eine Map<String, Set<String>> zu verwenden, die einen eindeutigen Schlüssel zu einem Set von eindeutigen Werten haben würde.

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

Der Vorteil der Verwendung das heißt, Sie müssen nicht von außen Bibliotheken in Datenstrukturen bringen, sind Sie genau die Java-Bibliotheken verwenden.

+1

Glücklich zu sehen, Java-Lösung. –

+0

@SilviuBurcea 'MultiMap's haben ihren Platz, aber die Notwendigkeit für sie ist ziemlich selten in meiner Erfahrung ... Ich brauchte nie einen in der ganzen Zeit, die ich programmiert habe – StormeHawke

+1

Ich denke, alle Google Groupies don 't wie meine reine Java-Lösung ... nur der Grund, warum ich nach unten Stimmen für eine vollkommen gültige Antwort sehen kann – StormeHawke