2011-06-30 87 views
15

Estoy buscando una explicación y/o una idea de por qué es mejor iterar sobre un HashMap.Java HashMap Quitar clave/valor

Por ejemplo, el siguiente código (en mi opinión) hace exactamente lo mismo (o debería). Sin embargo, si no repito sobre HashMap, la clave no se elimina.

_adjacentNodes.remove(node);   

Iterator<Map.Entry<String, LinkedList<Node>>> iterator = _adjacentNodes.entrySet().iterator(); 
while (iterator.hasNext()) { 
    Map.Entry<String, LinkedList<Node>> entry = iterator.next(); 
    if(node.getNodeID().contentEquals(entry.getKey())){ 
      iterator.remove(); 
    } 
} 

¿Qué está pasando?

Respuesta

13

Dado que su clave es una Cadena, debe eliminar Cadena no Nodo. Así que intente

_adjacentNodes.remove(node.getNodeID()); 
8

remove() funciona como se esperaba. Por ejemplo dado este programa:

import java.util.HashMap; 


public class HashMapExample { 
    public static void main(String[] args) { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(); 

     map.put("a", 1); 
     map.put("b", 2); 

     System.out.println("Before removal"); 
     for(String s : map.keySet()) { 
      System.out.println(s); 
     } 

     System.out.println("\n\nAfter removal"); 

     map.remove("a"); 
     for(String s : map.keySet()) { 
      System.out.println(s); 
     } 
    } 
} 

Esta es la salida siguiente:

Before removal 
b 
a 


After removal 
b 

La única cosa que puedo pensar en lo que va mal es que el objeto nodo que se está tratando de eliminar al comienzo no es el mismo objeto de nodo que el que obtienes del iterador. Es decir, tienen el mismo 'NodeID' pero son objetos diferentes. Quizás valga la pena que compruebe la devolución de remove().

Editar: Ha No detecté el error String/Object pero al menos estábamos yendo por el camino correcto;)

+0

hkn acaba de responder indicando que mi clave es una cadena y que estaba tratando de eliminar el objeto. –

+0

Sí, veo la edición, publicó mientras escribía. –

0

El punto aquí es que si está iterando sobre el hashmap y luego intenta manipularlo, fallará porque no puede hacer eso (incluso hay una excepción para eso).

Por lo tanto, debe utilizar un iterador para eliminar un elemento en la misma lista sobre la que está iterando.

+2

Su publicación no es verdadera. Para citar el Tutorial de Oracle sobre colecciones: _Tenga en cuenta que Iterator.remove es la única forma segura de modificar una colección durante la iteración; el comportamiento no se especifica si la colección subyacente se modifica de cualquier otro modo mientras la iteración está en progreso. [Ver cita de origen] (http://download.oracle.com/javase/tutorial/collections/interfaces/collection. html) – comrad