¿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?

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"

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

1

Usando la secuencia de Java:

keySet.forEach(map::remove);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.