web-dev-qa-db-fra.com

Supprimer plusieurs clés de la carte de manière efficace?

J'ai un Map<String,String> avec un grand nombre de paires de valeurs de clé. Maintenant, je veux supprimer les clés sélectionnées de ce Map. Le code suivant montre ce que j'ai fait pour y parvenir.

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

Ensuite :

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

Ça marche. Je veux juste savoir, quel serait un meilleur moyen de répondre à mes besoins?

106

En supposant que votre ensemble contienne les chaînes que vous souhaitez supprimer, vous pouvez utiliser la méthode keySet et map.keySet().removeAll(keySet);.

keySet renvoie une vue d'ensemble des clés contenues dans cette carte. L'ensemble est sauvegardé par la carte, de sorte que les modifications apportées à la carte sont répercutées dans l'ensemble, et inversement.

Exemple élaboré:

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"
214
assylias

Juste pour être complet:

Comme deviné Java.util.AbstractSet#removeAll itère vraiment toutes les entrées, mais avec un petit truc: il utilise l’itérateur de la plus petite collection:

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