繁体   English   中英

Java-HashMap迭代-异常

[英]Java - HashMap Iteration - Exception

我想像这样迭代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

有什么办法吗?

亲切的问候

 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();
   }
 }

您正在遍历地图时从地图中删除项目。 这就是导致异常的原因。

为了弄清楚为什么这样做是直觉的:如果地图包含三个项目,并且在第一次迭代中删除了第一项目,那么下一个项目应该是第二个项目还是第三个项目? 也就是说,迭代是否应该继续进行,好像已删除的项目仍在那儿一样? 如果是这样,怎么办?

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

您必须Set不使用Iterator情况下从现有Set移除元素,否则它将引发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);
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM