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

124

J'ai un Map<String,String>grand nombre de paires de valeurs clés. Maintenant, je veux supprimer les clés sélectionnées 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());
} 

Cela fonctionne. Je veux juste savoir, quelle serait la meilleure façon de répondre à mes besoins?

Ruchira Gayan Ranaweera
la source

Réponses:

241

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

keySetrenvoie une vue d'ensemble des clés contenues dans cette carte. L'ensemble est soutenu par la carte, de sorte que les modifications apportées à la carte sont reflétées dans l'ensemble, et vice-versa.

Exemple artificiel:

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"
assylies
la source
votre suggestion est excellente. Je suppose que removeAll (keySet) fait ce que j'ai fait là-bas
Ruchira Gayan Ranaweera
11
en termes d '"efficacité", c'est probablement juste une boucle for en dessous, mais en termes de code plus propre, belle victoire :)
rogerdpack
3

Juste pour être complet:

Comme deviné, java.util.AbstractSet#removeAllitère vraiment sur toutes les entrées, mais avec une petite astuce: 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());
    }
}
Sébastien
la source
1

Utilisation du flux Java:

keySet.forEach(map::remove);
Abdull
la source