web-dev-qa-db-fra.com

Java HashMap Suppression de clé/valeur

Je cherche simplement une explication et/ou un aperçu de la raison pour laquelle il est préférable de parcourir un HashMap.

Par exemple, le code ci-dessous (à mes yeux) fait exactement la même chose (ou devrait l'être). Cependant, si je n'itère pas sur HashMap, la clé n'est pas supprimée.

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

Que se passe-t-il?

16
Mitchell Romanuik

Étant donné que votre clé est une chaîne, vous devez supprimer la chaîne et non le nœud. Alors essayez 

_adjacentNodes.remove(node.getNodeID());   
13
hkn

remove () fonctionne comme prévu. Par exemple, étant donné ce programme:

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

Cela produira les éléments suivants:

Before removal
b
a


After removal
b

La seule chose que je peux imaginer qui ne va pas, c'est que l'objet nœud que vous essayez de supprimer au début n'est pas le même objet nœud que celui que vous obtenez de l'itérateur. C'est-à-dire qu'ils ont le même "NodeID" mais sont des objets différents. Cela vaut peut-être la peine que vous vérifiiez le retour de remove ().

Edit: Ha, je n'ai pas repéré l'erreur String/Object, mais au moins nous allions dans la bonne direction; )

8
Mike Kwan

Le point ici est que si vous effectuez une itération sur la table de hachage et essayez ensuite de la manipuler, cela échouera car vous ne pouvez pas le faire (il existe même une exception pour cela).

Vous devez donc utiliser un itérateur pour supprimer un élément de la liste sur laquelle vous effectuez une itération.

0
comrad