我想迭代一个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
任何解决方案?
亲切的问候
答案 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);
}
}