Mehrere Schlüssel effizient von Map entfernen?

123

Ich habe ein Map<String,String>mit einer großen Anzahl von Schlüsselwertpaaren. Jetzt möchte ich ausgewählte Schlüssel daraus entfernen Map. Der folgende Code zeigt, was ich getan habe, um das zu erreichen.

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

Dann :

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

Das funktioniert. Ich möchte nur wissen, wie ich meine Anforderungen besser erfüllen kann.

Ruchira Gayan Ranaweera
quelle

Antworten:

240

Angenommen, Ihr Set enthält die Zeichenfolgen, die Sie entfernen möchten, können Sie die keySetMethode und verwenden map.keySet().removeAll(keySet);.

keySetGibt eine Set-Ansicht der in dieser Map enthaltenen Schlüssel zurück. Das Set wird von der Karte unterstützt, sodass Änderungen an der Karte im Set berücksichtigt werden und umgekehrt.

Erfundenes Beispiel:

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"
Assylien
quelle
Ihr Vorschlag ist großartig. Ich denke, removeAll (keySet) macht das, was ich dort gemacht habe
Ruchira Gayan Ranaweera
11
In Bezug auf "Effizienz" ist es wahrscheinlich nur eine for-Schleife darunter, aber in Bezug auf saubereren Code, schöner Gewinn :)
Rogerdpack
3

Nur der Vollständigkeit halber:

Wie vermutet, java.util.AbstractSet#removeAlliteriert es wirklich über alle Einträge, aber mit einem kleinen Trick: Es verwendet den Iterator der kleineren Sammlung:

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

Verwenden von Java Stream:

keySet.forEach(map::remove);
Abdull
quelle