我想在不使用remove函数的情况下从哈希表中删除键。所以给我一些想法。
答案 0 :(得分:10)
您可以通过使用Map<K,V> map
补充Set<K> removedKeys
来模拟已删除的密钥。
要删除key
,只需removedKeys.add(key);
。
每当查询K key
时,您都会看到removedKeys.contains(key)
。如果是,则key
实际上已从map
“删除”。
请注意,这是一种非常特殊的做事方式,并且保持两个结构同步可能会导致后来的头痛。如果removedKeys
是本地化的并且是短暂的,例如,它是更可接受的。当您使用Map
迭代for-each
的条目并希望稍后删除某些密钥时,同时避免使用ConcurrentModificationException
。
所以你可能有这样的事情:
static void removeEvenKeys(Map<Integer,String> map) {
Set<Integer> removedKeys = new HashSet<Integer>();
for (Map.Entry<Integer,String> entry : map.entrySet()) {
if (entry.getKey() %2 == 0) {
removedKeys.add(entry.getKey());
}
}
map.keySet().removeAll(removedKeys);
}
然后在其他地方:
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.put(4, "Four");
removeEvenKeys(map);
System.out.println(map);
// "{1=One, 3=Three}"
答案 1 :(得分:6)
您可以在remove()
而不是Iterator
本身上致电Hashtable
:
Hashtable<String, String> map = new Hashtable<String, String>();
map.put("one", "een");
map.put("two", "twee");
map.put("three", "drie");
for (Iterator<Map.Entry<String, String>> i = map.entrySet().iterator(); i.hasNext(); ) {
Map.Entry<String, String> entry = i.next();
if ("two".equals(entry.getKey())) {
// Removes entry from Hashtable; note, this is not the Hashtable.remove() method
// but the Iterator.remove() method
i.remove();
}
}
System.out.println(map);
(注意:您应该使用HashMap
代替旧版集合类Hashtable
。)