在迭代HashMap时如何删除另一个项目(不是你持有的项目)

时间:2012-01-20 20:34:59

标签: java hashmap

我试图通过互联网搜索找到删除其他项目但不是您正在访问的项目的解决方案。不幸的是,没有办法做到这一点。

这是问题所在。

假设我有一个hashmap和 这些项目是< 0,10> < 1,20> < 2,30>

    Map<Integer,Integer> map = new HashMap<Integer, Integer>() ;
    Iterator<Map.Entry<Integer, Integer> >entries = map.entrySet().iterator();

    while (entries.hasNext()) {
        Entry<Integer, Integer> entry = entries.next();
        int temp = entry.getValue();
        if (temp==0){
            map.remove(2);  //2 is the key of 3th item
        }
    }

然后问题就出现了。 真的很感激这些建议。

4 个答案:

答案 0 :(得分:5)

分两次通过:

  1. 遍历这些条目,并在Set<Integer>
  2. 中收集要删除的密钥
  3. 遍历集合,并从地图中删除它包含的所有密钥。 (或致电map.keySet().removeAll(keysToRemove)

答案 1 :(得分:3)

让我猜一下,你得到一个ConcurrentModificationException

那已经出炉了.javadocs说,如果你正在做你正在做的事情,它可能会被抛出。您可以关注@JBNizet's,也可以在每次删除元素时重新开始迭代。您选择的将取决于您的具体情况。

第三个选项是创建条目集的副本并对其进行迭代。如果重新启动迭代很昂贵并且需要快速删除,那么这个方法效果最好。

Iterator<Map.Entry<Integer, Integer> >entries = new HashSet<Map.Entry<Integer, Integer>>(map.entrySet()).iterator();

答案 2 :(得分:2)

在2次传递中执行,第1次累积要删除的键,然后执行实际删除:

List<Integer> keysToRemove = ...

while (entries.hasNext()) {
    Entry<Integer, Integer> entry = entries.next();
    int temp = entry.getValue();
    if (temp==0){
        keysToRemove.add(2);
    }
 }

for (Integer key : keysToRemove)
    map.remove(key);

答案 3 :(得分:1)

在迭代HashMap时,您无法修改它。相反,您可以在迭代地图时收集要删除的键列表,然后在完成迭代后从地图中删除列表中的项目。