2010-02-28 18 views
35

Ho un Hashtable in Java e voglio eseguire un'iterazione su tutti i valori nella tabella ed eliminare una coppia di valori-chiave durante l'iterazione.Iterating over e delete da Hashtable in Java

Come si può fare?

+0

Lo stesso per HashMap e altre mappe: http://stackoverflow.com/questions/46898/iterate-over -each-entry-in-a-map –

risposta

37

è necessario utilizzare un esplicito java.util.Iterator di iterare l'ingresso s' il Map set piuttosto che essere in grado di utilizzare la sintassi migliorata per-loop disponibili in Java 6. Il seguente esempio itera su un Map di Integer, String coppie, la rimozione di una voce la cui Integer chiave è nulla o uguale a 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

Non è possibile avere chiavi 'null' in un' Hashtable'. Questo è ciò che lo rende diverso da una 'Mappa'. Inoltre, stai interrogando 'Map.Entry getValue' nel codice sopra, invece di' getKey'. Non puoi fare 'entry.getValue() == 0' perché i valori sono di tipo' String'. – polygenelubricants

+1

@polygenelubricants, Map è un'interfaccia che non applica restrizioni su null. HashMap è un'implementazione di mappe che non consente valori nulli. –

+1

Non faccio riferimento a Hashtable nel mio codice e non lo userei comunque poiché è sostituito da HashMap (che ** fa ** consente chiavi e valori nulli). – Adamski

4

è possibile utilizzare una temporanea lista cancellazione:

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

È è possibile trovare ulteriori informazioni sui metodi di Hashtable nello Java API

+1

È possibile farlo ma non è necessario utilizzare una raccolta aggiuntiva; Rende solo le cose più complicate. – Adamski

6

Quindi si conosce la coppia di valori chiave che si desidera eliminare in anticipo? E 'solo molto più chiaro per fare questo, allora:

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

conoscevo solo il valore, quindi non funzionerà. Grazie per aver guardato –

41

È possibile utilizzare 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); 
}