2010-02-28 4 views
35

J'ai une table hachage en Java et je souhaite parcourir toutes les valeurs de la table et supprimer une paire clé-valeur particulière pendant l'itération.Itération et suppression de Hashtable dans Java

Comment cela peut-il être fait?

+0

Idem pour HashMap et d'autres cartes: http://stackoverflow.com/questions/46898/iterate-over -each-entry-in-a-map –

Répondre

37

Vous devez utiliser un explicite java.util.Iterator itérer sur l'entrée de Map établi plutôt que d'être en mesure d'utiliser la syntaxe améliorée Pour boucle disponible en Java 6. Les itère exemple suivant sur une Map de Integer, String paires, supprimant toute entrée dont Integer clé est nul ou égal à 0.

Map<Integer, String> map = ... 

Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); 

while (it.hasNext()) { 
    Map.Entry<Integer, String> entry = it.next(); 

    // Remove entry if key is null or equals 0. 
    if (entry.getKey() == null || entry.getKey() == 0) { 
    it.remove(); 
    } 
} 
+5

Vous ne pouvez pas avoir les clés 'null' dans un' Hashtable'. C'est ce qui le rend différent d'un 'Map'. En outre, vous interrogez 'Map.Entry getValue' dans le code ci-dessus, au lieu de' getKey'. Vous ne pouvez pas faire 'entry.getValue() == 0' car les valeurs sont de type' String'. – polygenelubricants

+1

@polygenelubricants, Map est une interface qui ne fait aucune restriction sur null. HashMap est une implémentation Map qui n'autorise pas les valeurs nulles. –

+1

Je ne référence pas Hashtable dans mon code et je ne l'utiliserais pas car il est remplacé par HashMap (qui ** autorise ** les clés et les valeurs NULL). – Adamski

4

Vous pouvez utiliser une liste de suppression temporaire:

List<String> keyList = new ArrayList<String>; 

for(Map.Entry<String,String> entry : hashTable){ 
    if(entry.getValue().equals("delete")) // replace with your own check 
    keyList.add(entry.getKey()); 
} 

for(String key : keyList){ 
    hashTable.remove(key); 
} 

Vous pouvez trouver plus d'informations sur les méthodes Hashtable dans le Java API

+1

Vous pouvez le faire mais il n'est pas nécessaire d'utiliser une collection supplémentaire; Cela rend les choses plus compliquées. – Adamski

6

Donc vous connaissez la clé, paire de valeur que vous souhaitez supprimer à l'avance? Il est juste beaucoup plus clair pour le faire, alors:

table.delete(key); 
for (K key: table.keySet()) { 
    // do whatever you need to do with the rest of the keys 
} 
+0

Je ne connaissais que la valeur, donc cela ne marchera pas. Merci de regarder –

41

Vous pouvez utiliser Enumeration:

Hashtable<Integer, String> table = ... 

Enumeration<Integer> enumKey = table.keys(); 
while(enumKey.hasMoreElements()) { 
    Integer key = enumKey.nextElement(); 
    String val = table.get(key); 
    if(key==0 && val.equals("0")) 
     table.remove(key); 
}