pol*_*nts 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);
}
Run Code Online (Sandbox Code Playgroud)
其他地方:
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}"
Run Code Online (Sandbox Code Playgroud)
您可以拨打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);
Run Code Online (Sandbox Code Playgroud)
(注意:您应该使用HashMap而不是遗留的集合类Hashtable).