如何在以下代码中避免Java.util.IllegalStateException?

时间:2011-10-04 21:48:08

标签: java exception collections iterator arraylist

我有一个包含重复值的整数列表。我需要做的是找到重复的整数,添加它们的值,然后通过删除找到的重复项将结果添加到列表中。这就是我在做的事情:

List<Integer> list1 = new ArrayList<Integer>();
    list1.add(2);
    list1.add(5);
    list1.add(3);
    list1.add(5);
    list1.add(4);

    List<Integer> list2 = new ArrayList<Integer>();
    Iterator<Integer> it = list1.iterator();
    while (it.hasNext()) {
        Integer int1 = it.next();
        if (list2.isEmpty()) {
            list2.add(int1);
            it.remove();
        } else {
            ListIterator<Integer> it2 = list2.listIterator();
            while (it2.hasNext()) {
                Integer int2 = it2.next(); 
                if (int2 != int1) {
                    it2.add(int1);
                    it.remove();// I get exception here

                } else {                        
                    it2.remove();
                    it.remove();
                    Integer newint = int1 + int2;
                    it2.add(newint);
                }                   
            }
        }
    }       
    for(Integer in : list2){
        System.out.println(in);
    }

输出应该看起来像     2
10
3
4

感谢您的时间。

5 个答案:

答案 0 :(得分:3)

正如其他海报所说,你不能在迭代时删除。尽管存在“技巧”,但在迭代时搞乱一个集合是获得奇怪的运行时错误的必然方法。

无论如何,你在这个问题上的工作太过努力了。

这是一个快速而肮脏的解决方案,只有一小部分代码:

private List<Integer> sumAndUniqDuplicates(List<Integer> list) {
    LinkedHashMap<Integer, Integer> lookup = new LinkedHashMap<Integer, Integer>();
    for (Integer value : list) {
        Integer prevValue = lookup.get(value);
        prevValue = (prevValue == null) ? 0 : prevValue;
        lookup.put(value, prevValue + value);
    }
    return new ArrayList<Integer>(lookup.values());
}

答案 1 :(得分:2)

这是因为你删除了两次相同的元素。 if(list2.isEmpty())中的第一次(因为list2else正文的开头和之后是空的。

答案 2 :(得分:2)

如果您被允许使用Map,您可以做一些简单的事情(传入伪代码):

create empty Map m
for each Integer x in list1 do
    if m does not contain key x 
        m.put(x, x)
    else
        m.put(x, m.get(x) + x)
    endif
done

您的结果是m的值(这是一个集合)。

编辑:你说你有LatLng而不是整数 - 我不知道LatLng但是在快速google之后我会拍摄以下内容,假设您要“添加”拉上你的LatLng积分:

create empty Map<LatLng, LatLng> m
for each LatLng x in list1 do
    if not m.containsKey(x) 
        m.put(x, x)
    else
        m.put(x, LatLng.newInstance(m.get(x).getLatitude() + x.getLatitude(),
                                    m.get(x).getLongitude() + x.getLongitude()))
    endif
done

我在这里看到的唯一问题是m.containsKey(x)取决于equals的正确实施,我在阅读this之后不确定

答案 3 :(得分:1)

来自remove方法的文档:

  

从底层集合中移除迭代器返回的最后一个元素(可选操作)。 每次调用next时,只能调用一次此方法。

答案 4 :(得分:1)

您无法删除当前元素两次。你需要重新思考你的逻辑。