2013-07-16 12 views
80

Ho un Map<String,String> con un numero elevato di coppie di valori chiave. Ora voglio rimuovere le chiavi selezionate da quello Map. Il codice seguente mostra cosa ho fatto per ottenere ciò.Rimuovere più chiavi dalla mappa in modo efficiente?

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

Poi:

Iterator entriesIterator = keySet.iterator(); 
while (entriesIterator.hasNext()) { 
    map.remove(entriesIterator.next().toString()); 
} 

Questo è il lavoro. Voglio solo sapere, quale sarebbe un modo migliore per raggiungere il mio requisito?

risposta

161

Supponendo che il set contenga le stringhe che si desidera rimuovere, è possibile utilizzare the keySet method e map.keySet().removeAll(keySet);.

keySet restituisce una vista Imposta delle chiavi contenute in questa mappa. Il set è supportato dalla mappa, quindi le modifiche alla mappa si riflettono nel set e viceversa.

esempio inventato:

Map<String, String> map = new HashMap<>(); 
map.put("a", ""); 
map.put("b", ""); 
map.put("c", ""); 

Set<String> set = new HashSet<>(); 
set.add("a"); 
set.add("b"); 

map.keySet().removeAll(set); 

System.out.println(map); //only contains "c" 
+0

il tuo suggerimento è fantastico. Immagino che removeAll (keySet) stia facendo quello che ho fatto lì –

+8

in termini di "efficienza" è probabilmente solo un ciclo for sotto, ma in termini di codice più pulito, bella vittoria :) – rogerdpack

+0

thaks, ho usato retainAll anche il suo cool – shareef

1

Solo per ragioni di completezza:

Come indovinato java.util.AbstractSet#removeAll davvero itera su tutte le voci, ma con un piccolo trucco: Si utilizza l'iteratore della collezione più piccola :

if (size() <= collection.size()) { 
    Iterator<?> it = iterator(); 
    while (it.hasNext()) { 
     if (collection.contains(it.next())) { 
      it.remove(); 
     } 
    } 
} else { 
    Iterator<?> it = collection.iterator(); 
    while (it.hasNext()) { 
     remove(it.next()); 
    } 
} 
Problemi correlati