2010-02-28 74 views
35

我在Java中有一個哈希表,並且希望迭代表中的所有值並在迭代時刪除特定的鍵值對。在Java中迭代和從哈希表中刪除

這可怎麼辦?

+0

同爲HashMap和其他地圖:http://stackoverflow.com/questions/46898/iterate-over -ach-entry-in-a-map – 2015-04-11 10:24:00

回答

37

您需要使用一個明確的java.util.Iterator遍歷Map的項設置,而不是能夠在IntegerMapString雙使用可用的增強的for循環語法的Java 6.下列示例循環,除去其Integer鍵爲空或等於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

你不能在'Hashtable'中有'null'鍵。這就是它與「Map」不同的地方。另外,你正在上面的代碼中查詢'Map.Entry getValue',而不是'getKey'。你不能執行'entry.getValue()== 0',因爲這些值的類型是'String'。 – polygenelubricants 2010-02-28 14:55:28

+1

@polygenelubricants,Map是一個對null沒有限制的接口。 HashMap是一個不允許空值的Map實現。 – 2010-02-28 16:28:03

+1

我沒有在我的代碼中引用Hashtable,並且不會使用它,因爲它被HashMap取代(它**不允許空鍵和值)。 – Adamski 2010-02-28 19:01:32

4

您可以使用一個臨時刪除列表中的任何條目:

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

你可以在Java API

+1

您可以這樣做,但不需要使用額外的集合;這隻會讓事情變得更加複雜。 – Adamski 2010-02-28 19:05:06

6

中找到更多關於Hashtable方法的信息所以你知道你想要提前刪除的鍵值對嗎?這只是更清楚地做到這一點,則:

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

我只知道價值,所以這不會工作。 雖然感謝您的期待 – 2010-02-28 15:44:57

41

您可以使用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); 
}