2011-05-23 26 views
124

Estoy teniendo HashMap llamado testMap que contiene String, String.¿Cómo eliminar una clave de HashMap mientras se itera sobre ella?

HashMap<String, String> testMap = new HashMap<String, String>(); 

cuando se repite el mapa, si es value partido con la cadena especificada, tengo que quite la llave del mapa.

decir

for(Map.Entry<String, String> entry : testMap.entrySet()) { 
    if(entry.getValue().equalsIgnoreCase("Sample")) { 
    testMap.remove(entry.getKey()); 
    } 
} 

testMap contiene "Sample" pero no puedo quitar la llave de HashMap.
En vez conseguir el error:

"Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.HashMap$HashIterator.nextEntry(Unknown Source) 
    at java.util.HashMap$EntryIterator.next(Unknown Source) 
    at java.util.HashMap$EntryIterator.next(Unknown Source)" 
+1

favor siempre copiar/pegar fragmentos de código, en vez de escribir 'algo así como' el código utilizado. El código original que se muestra no puede lanzar una excepción en tiempo de ejecución, ya que no está disponible. –

+1

Otra opción, aunque discreta, es crear una lista de los objetos que desea eliminar mientras itera. Luego puede crear otro ciclo después de su bucle inicial que itera sobre esa lista y los elimina del hashmap. – eipark

Respuesta

242

Probar:

Iterator<Map.Entry<String,String>> iter = TestMap.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry<String,String> entry = iter.next(); 
    if("Sample".equalsIgnoreCase(entry.getValue())){ 
     iter.remove(); 
    } 
} 

Con Java 1.8 y en adelante se puede hacer lo anterior en una sola línea:

TestMap.entrySet().removeIf(entry -> !TestMap.contains("Sample")); 
+3

¿Qué sucede si desea eliminar un elemento que no es el que está en su iterador? – HDave

+6

@HDave Es posible usar un método como 'Map.remove (Object key)', pero no debe hacerse durante la iteración. Si usa cualquier método de eliminación que no sea 'Iterator.remove()' durante la iteración, los resultados de la iteración no están definidos. O espere hasta que el iterador esté "encendido" la entrada que desea eliminar y use 'Iterator.remove()', o hágalo fuera de (antes/después) del ciclo de iteración. Si es el último, asegúrese de obtener un nuevo iterador de la entrada establecida antes de realizar cualquier iteración en el mapa, ya que cualquier iterador anterior arrojará resultados no definidos. –

+1

O podría usar un bucle 'for' con una semántica similar, vea http://stackoverflow.com/a/1884916/32453 – rogerdpack

-30

Para eliminar la clave y el elemento específicos del uso de hashmap

hashmap.remove(key) 

código fuente completo es como

import java.util.HashMap; 
public class RemoveMapping { 
    public static void main(String a[]){ 
     HashMap hashMap = new HashMap(); 
     hashMap.put(1, "One"); 
     hashMap.put(2, "Two"); 
     hashMap.put(3, "Three"); 
     System.out.println("Original HashMap : "+hashMap); 
     hashMap.remove(3); 
     System.out.println("Changed HashMap : "+hashMap);   
    } 
} 

Fuente: http://www.tutorialdata.com/examples/java/collection-framework/hashmap/remove-mapping-of-specified--key-from-hashmap

+1

No leyó toda la pregunta – Stefan

Cuestiones relacionadas