2013-09-24 15 views
19

Codice:Come eliminare i duplicati nei valori di Guava MultiMap?

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

Risultato:

{12345=[qwer, abcd, qwer]} 

E 'possibile eliminare "qwer" duplicato? Grazie.

risposta

29

Utilizzare una delle SetMultimap implementazioni, ad esempio 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

Come indica la documentazione, un riferimento a un piano Multimap è raramente preferito su una delle sottointerfacce per gli stessi motivi per cui i riferimenti alla Raccolta sono raramente preferiti su Set, Elenco, ecc. L'LHS del compito dovrebbe essere un SetMultimap. – gk5885

+1

@ gk5885 Buon punto, codice aggiornato. – gustafc

12

A ListMultimap come ArrayListMultimap consente coppie di valori-chiave duplicati. Prova un'implementazione di SetMultimap come HashMultimap o TreeMultimap.

+1

@StormeHawke tranne che sarebbe meno leggibile. – gustafc

+2

@StormeHawke Non ho bisogno di battere ciglio quando lo leggo, ma sicuramente mi fa male guardare. Il fatto è che quando torni un anno dopo per mantenere questo codice, devi capire come questa particolare ruota è stata reinventata. Conterrà set vuoti per chiavi senza valori? In tal caso, ci sono valori vuoti per le chiavi * all * previste, o solo per alcuni? Ci saranno valori nulli tra i valori? E poi inizi a maledire l'autore originale ("Damn you, past me!") Per non usare una collezione con un contratto e un intento chiaramente definiti, cioè multimap. – gustafc

0

Ci sono molti modi per farlo. Il più semplice sarebbe utilizzare un SetMultimap.

Un'unica soluzione JDK con l'esempio fornito, tuttavia, sarebbe semplicemente utilizzare uno Map<String, Set<String>>, che avrebbe una chiave univoca in uno Set di valori univoci.

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

Il vantaggio di utilizzare che è che non c'è bisogno di portare in strutture di dati da librerie esterne, si sta rigorosamente utilizzando le librerie di base Java.

+1

Felice di vedere la semplice soluzione Java. –

+0

@SilviuBurcea 'I MultiMap hanno il loro posto, ma il loro bisogno è piuttosto raro nella mia esperienza ... Non ho mai avuto bisogno di usarne uno in tutto il tempo che ho programmato – StormeHawke

+1

Immagino che tutte le groupie di google indichino Mi piace la mia soluzione java pura ... solo la ragione per cui vedo voti bassi su una risposta perfettamente valida – StormeHawke