添加列表中包含的元素并将它们映射到字符串

时间:2016-07-16 09:49:24

标签: java arraylist hashmap iterator concurrentmodification

输入

  

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)

有人可以告诉我哪里出错了?

1 个答案:

答案 0 :(得分:2)

问题是你正在迭代myMapList,但在迭代时修改它:

myMapList.add(newMap);

我仍然没有完全掌握你想要做的事情,但从根本上说,你不应该在迭代它时添加到集合中。一种常见的方法是创建一个 new 集合,您在迭代时修改该集合,然后(如有必要)随后对原始集合执行批量修改。

(正如Titus所说,你也在循环中调用next()两次......你需要更加谨慎地使用你的迭代器,并尽可能使用增强的for循环。)< / p>