【发布时间】:2011-01-22 00:29:56
【问题描述】:
我在 Java 中有一个 Hashtable,想要遍历表中的所有值并在迭代时删除特定的键值对。
如何做到这一点?
【问题讨论】:
-
HashMap 和其他地图相同:stackoverflow.com/questions/46898/…
我在 Java 中有一个 Hashtable,想要遍历表中的所有值并在迭代时删除特定的键值对。
如何做到这一点?
【问题讨论】:
您需要使用显式 java.util.Iterator 来迭代 Map 的条目集,而不是能够使用 Java 6 中提供的增强型 For 循环语法。以下示例迭代 Map 的Integer、String 对,删除任何 Integer 键为 null 或等于 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();
}
}
【讨论】:
Hashtable 中不能有 null 键。这就是它与Map 的不同之处。此外,您在上述代码中查询的是Map.Entry getValue,而不是getKey。你不能做entry.getValue() == 0,因为值的类型是String。
Hashtable,因为这就是 OP 所拥有的。而@Steve,HashMap 确实允许空值 (java.sun.com/javase/6/docs/api/java/util/HashMap.html)。
您可以使用临时删除列表:
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 中找到有关 Hashtable 方法的更多信息
【讨论】:
所以您知道要提前删除的键值对吗?这样做就更清楚了,那么:
table.delete(key);
for (K key: table.keySet()) {
// do whatever you need to do with the rest of the keys
}
【讨论】:
你可以使用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);
}
【讨论】: