[英]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.