2013-09-24 18 views
19

Kod:Jak wyeliminować duplikaty w wartościach MultiMap Guava?

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

Wynik:

{12345=[qwer, abcd, qwer]} 

Czy to możliwe, aby wyeliminować duplikaty "qwer"? Dzięki.

Odpowiedz

29

Użyj jednej z implementacji SetMultimap np 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

Jako stan dokumentacji, odniesienie do planu Multimap rzadko jest preferowane w stosunku do jednego z podinterfejsów z tych samych powodów, dla których odwołania do kolekcji są rzadko preferowane w porównaniu z ustawieniem, listą itp. LHS przypisania powinno być ustawieniem SetMultimap. – gk5885

+1

@ gk5885 Dobry punkt, kod zaktualizowany. – gustafc

12

A ListMultimap, taki jak ArrayListMultimap, umożliwia duplikowanie par klucz-wartość. Wypróbuj implementację SetMultimap, taką jak HashMultimap lub TreeMultimap.

+1

@StormeHawke z wyjątkiem tego, że byłby mniej czytelny. – gustafc

+2

@StormeHawke Nie muszę mrugać, kiedy czytam, ale na pewno boli patrząc. Chodzi o to, że po roku powracania w celu zachowania tego kodu, musisz dowiedzieć się, jak to nowe koło zostało odkryte na nowo. Czy będzie zawierał puste zestawy dla kluczy bez wartości? Jeśli tak, czy są puste wartości dla * wszystkich * oczekiwanych kluczy, czy tylko dla niektórych? Czy wśród wartości będą wartości zerowe? A potem zaczynasz przeklinać oryginalnego autora ("Cholera, za mną!"), Ponieważ nie używasz kolekcji z jasno określoną umową i intencją, tj. Multimap. – gustafc

0

Istnieje wiele sposobów, aby to zrobić. Najprostszym byłoby użycie SetMultimap.

Jedynym rozwiązaniem JDK z podanym przykładem byłoby po prostu użycie Map<String, Set<String>>, który miałby jeden niepowtarzalny klucz do Set unikalnych wartości.

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

Zaletą korzystania czyli nie trzeba wnieść w strukturach danych z bibliotek zewnętrznych, jesteś ściśle stosując podstawowe biblioteki Java.

+1

Cieszę się, że widzę zwykłe rozwiązanie Java. –

+0

@SilviuBurcea 'MultiMap's ma swoje miejsce, ale potrzeba ich jest dość rzadka w moim doświadczeniu ... Nigdy nie potrzebowałem używać jej przez cały czas programowania – StormeHawke

+1

Chyba wszystkie grupki google Podoba mi się moje czyste rozwiązanie java ... Jedyny powód, dla którego mogę zobaczyć, że nie głosuję na całkowicie poprawną odpowiedź: – StormeHawke