2010-02-28 75 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); 
}