SomeName SomeFine
OtherName OtherFine
SomeOtherName SomeOtherFine
OtherName SomeOtherFine
SomeName OtherFine
我想制作一个List<Map<String, Integer>>
,以便创建一个名单列表以及对他们征收的罚款总额
我期望的输出(参考上面的例子)是这样的:
[SomeName = SomeFine + OtherFine,OtherName = OtherFine + SomeOtherFine,SomeOtherName = SomeOtherFine]
我尝试使用以下代码,但它给了我ConcurrentModificationException
。这是代码:
public List<Map<String, Integer>> calculateTotalFine(){
List<Map<String, Integer>> myMapList = new ArrayList<Map<String, Integer>>();
ListIterator<CrimeInfo> crimeIterator = list.listIterator();
while(crimeIterator.hasNext()){
String key = crimeIterator.next().getName();
Integer value = crimeIterator.next().getFine();
if(myMapList.isEmpty()){
Map<String, Integer> aMap = new HashMap<String, Integer>();
aMap.put(key, value);
myMapList.add(aMap);
}
else{
Iterator<Map<String, Integer>> mapIterator = myMapList.iterator();
while(mapIterator.hasNext()){
if(mapIterator.next().containsKey(key)){ //<-- Line no. 29
Integer newFine = mapIterator.next().get(key) + value;
mapIterator.remove();
Map<String, Integer> nMap = new HashMap<String, Integer>();
nMap.put(key, newFine);
myMapList.add(nMap);
}
else{
Map<String, Integer> newMap = new HashMap<String, Integer>();
newMap.put(key, value);
myMapList.add(newMap);
}
}
}
}
return myMapList;
}
线程中的异常&#34; main&#34; java.util.ConcurrentModificationException at java.util.ArrayList $ Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList $ Itr.next(ArrayList.java:851) 在com.company.CoreLogic.calculateTotalFine(CoreLogic.java:29)
有人可以告诉我哪里出错了?
答案 0 :(得分:2)
问题是你正在迭代myMapList
,但在迭代时修改它:
myMapList.add(newMap);
我仍然没有完全掌握你想要做的事情,但从根本上说,你不应该在迭代它时添加到集合中。一种常见的方法是创建一个 new 集合,您在迭代时修改该集合,然后(如有必要)随后对原始集合执行批量修改。
(正如Titus所说,你也在循环中调用next()
两次......你需要更加谨慎地使用你的迭代器,并尽可能使用增强的for循环。)< / p>