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.