2010-02-28 13 views
35

Ich habe eine Hashtable in Java und möchte über alle Werte in der Tabelle iterieren und ein bestimmtes Schlüssel/Wert-Paar beim Iterieren löschen.Iterieren und löschen von Hashtable in Java

Wie kann dies geschehen?

+0

Das Gleiche gilt für HashMap und anderen Karten: http://stackoverflow.com/questions/46898/iterate-over -each-entry-in-a-map –

Antwort

37

Sie benötigen eine explizite java.util.Iterator verwenden, um über die Map den Einstieg eher auf iterieren als Syntax in Java 6. Die folgenden Beispiel iteriert über eine String Paare Map von Integer, erhältlich in der Lage, die verbesserte For-Schleife zu verwenden, Entfernen jeglicher Eintrag, dessen Integer Schlüssel ist null oder gleich 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

Sie können keine 'Null'-Schlüssel in einer' Hashtable' haben. Das unterscheidet sie von einer "Map". Außerdem fragen Sie 'Map.Entry getValue' im obigen Code statt' getKey' ab. Sie können 'entry.getValue() == 0' nicht ausführen, da die Werte vom Typ 'String' sind. – polygenelubricants

+1

@polygeneubricants, Karte ist eine Schnittstelle, die keine Einschränkungen für null vornimmt. HashMap ist eine Map-Implementierung, die Nullen nicht zulässt. –

+1

Ich verweise nicht auf Hashtable in meinem Code und würde es sowieso nicht verwenden, da es durch HashMap ersetzt wird (was ** erlaubt ** Nullschlüssel und Werte). – Adamski

4

Sie eine temporäre Löschliste verwenden können:

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

Sie finden Sie weitere Informationen zu Hashtable-Methoden in der Java API

+1

Sie können dies tun, aber es ist nicht notwendig, eine zusätzliche Sammlung zu verwenden; Es macht die Dinge nur komplizierter. – Adamski

6

So kennen Sie den Schlüssel, Wert-Paar, das Sie im Voraus löschen möchten? Es ist nur so viel klarer, dies zu tun, dann:

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

Ich wusste nur den Wert, also wird das nicht funktionieren. Danke, obwohl Sie gesucht haben –

41

Sie Enumeration verwenden können:

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