2013-07-16 8 views
80

Ich habe eine Map<String,String> mit einer großen Anzahl von Schlüsselpaaren. Jetzt möchte ich ausgewählte Schlüssel aus diesem Map entfernen. Der folgende Code zeigt, was ich getan habe, um das zu erreichen.Entfernen Sie mehrere Schlüssel aus Map auf effiziente Weise?

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

Dies funktioniert. Ich möchte nur wissen, was wäre ein besserer Weg, um meine Anforderung zu erfüllen?

Antwort

161

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

keySet gibt eine Set-Ansicht der in dieser Map enthaltenen Schlüssel zurück. Das Set wird durch die Map unterstützt, sodass Änderungen an der Map in der Menge widergespiegelt werden und umgekehrt.

konstruiertes 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" 
+0

Ihr Vorschlag ist großartig. Ich denke removeAll (keySet) macht, was ich dort gemacht habe –

+8

in Bezug auf "Effizienz" ist es wahrscheinlich nur eine for-Schleife darunter, aber in Bezug auf sauberer Code, nice win :) – rogerdpack

+0

Thaks, ich verwendet retainAll seine coole auch – shareef

1

Nur aus Gründen der Vollständigkeit:

Als java.util.AbstractSet#removeAll wirklich iteriert über alle Einträge erraten, aber mit einem kleinen Trick: Es nutzt 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()); 
    } 
} 
Verwandte Themen