¿Eliminar varias claves del mapa de manera eficiente?

124

Tengo un Map<String,String>gran número de pares de valores clave. Ahora quiero eliminar las claves seleccionadas de eso Map. El siguiente código muestra lo que hice para lograrlo.

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

Luego :

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

Esto está funcionando. Solo quiero saber, ¿cuál sería una mejor manera de lograr mi requisito?

Ruchira Gayan Ranaweera
fuente

Respuestas:

241

Suponiendo que su conjunto contiene las cadenas que desea eliminar, puede usar el keySetmétodo y map.keySet().removeAll(keySet);.

keySetdevuelve una vista de conjunto de las claves contenidas en este mapa. El conjunto está respaldado por el mapa, por lo que los cambios en el mapa se reflejan en el conjunto y viceversa.

Ejemplo elaborado:

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"
Assylias
fuente
tu sugerencia es genial. Supongo que removeAll (keySet) está haciendo lo que hice allí
Ruchira Gayan Ranaweera
11
en términos de "eficiencia" es probablemente solo un bucle for debajo, pero en términos de código más limpio, buena victoria :)
rogerdpack
3

Solo en aras de la integridad:

Como se adivinó, java.util.AbstractSet#removeAllrealmente itera sobre todas las entradas, pero con un pequeño truco: usa el iterador de la colección más pequeña:

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());
    }
}
Sebastián
fuente
1

Usando la secuencia de Java:

keySet.forEach(map::remove);
Abdull
fuente