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.

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"

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

1

Verwenden von Java Stream:

keySet.forEach(map::remove);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.