Rimuovere più chiavi dalla mappa in modo efficiente?


124

Ho un Map<String,String>con un gran numero di coppie di valori chiave. Ora voglio rimuovere le chiavi selezionate da quello Map. Il codice seguente mostra cosa ho fatto per ottenerlo.

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());
} 

Funziona. Voglio solo sapere, quale sarebbe un modo migliore per soddisfare le mie esigenze?

Risposte:


241

Supponendo che il tuo set contenga le stringhe che vuoi rimuovere, puoi usare il keySetmetodo e map.keySet().removeAll(keySet);.

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

Esempio artificioso:

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"

il tuo suggerimento è ottimo. Immagino che removeAll (keySet) stia facendo quello che ho fatto lì
Ruchira Gayan Ranaweera

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

3

Solo per completezza:

Come indovinato, java.util.AbstractSet#removeAllitera davvero su tutte le voci, ma con un piccolo trucco: utilizza l'iteratore della raccolta 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());
    }
}

1

Utilizzando Java stream:

keySet.forEach(map::remove);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.