Java - HashMap迭代 - 异常

时间:2017-03-29 20:41:50

标签: java hashmap

我想迭代一个HashMap,如:

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            map.replace(entry.getKey(), entry.getValue()-1);
            if (entry.getValue() == 0) {
                map.remove(entry.getKey(), 0);
            }
        }

以异常结束:java.util.ConcurrentModificationException

任何解决方案?

亲切的问候

3 个答案:

答案 0 :(得分:1)

 Iterator<Map.Entry<Integer, Integer>> entryItr = map.entrySet().iterator();
 while (entryItr.hasNext()) {
   Map.Entry<Integer, Integer> entry = entryItr.next();
   if (entry.getValue() > 1) {
     entry.setValue(entry.getValue() - 1);
   } else {
     entryItr.remove();
   }
 }

答案 1 :(得分:0)

您正在重复删除地图中的项目。这就是引起异常的原因。

为了得到一些直觉,为什么会这样:如果你的地图包含三个项目,并且在第一次迭代中你删除了第一个项目,那么下一个项目应该是第二项还是第三项?也就是说迭代会继续,好像被删除的项目仍在那里?如果是这样,怎么样?

你可以通过在地图上使用迭代器来解决这个问题,它可以安全地遍历地图的每个元素。

答案 2 :(得分:0)

如果不使用Set,则无法从现有Iterator中删除元素,否则会抛出ConcurrentModificationException

因此,请将值放在new Map对象if(value-1 !=0)上,如下所示:

        Map<Integer, Integer> map = new HashMap<>();
        Map<Integer, Integer> newMap = new HashMap<>();
        Iterator<Integer> iterator =map.keySet().iterator();
        while(iterator.hasNext()) {
            int key = iterator.next();
            int value = map.get(key);
            if(value-1 !=0) {
                newMap.put(key, value-1);
            }
        }