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

如何在下面的代码中避免Java.util.IllegalStateException?,java,exception,collections,iterator,arraylist,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 =

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

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);
    }
List list1=new ArrayList();
清单1.添加(2);
清单1.添加(5);
清单1.添加(3);
清单1.添加(5);
清单1.添加(4);
List list2=新的ArrayList();
迭代器it=list1.Iterator();
while(it.hasNext()){
整数int1=it.next();
if(list2.isEmpty()){
列表2.add(int1);
it.remove();
}否则{
ListIterator it2=list2.ListIterator();
while(it2.hasNext()){
整数int2=it2.next();
如果(int2!=int1){
it2.add(int1);
it.remove();//我在这里遇到异常
}否则{
it2.删除();
it.remove();
整数newint=int1+int2;
it2.添加(newint);
}                   
}
}
}       
for(列表2中的整数){
系统输出打印项次(输入);
}
输出应类似于
2
10
3
4


感谢您的时间。

来自
删除方法的文档:

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


这是因为删除同一元素两次。第一次在
if(list2.isEmpty())
(因为
list2
开头是空的,紧接着在
else
正文中是空的。

您不能删除当前元素两次。您需要重新考虑您的逻辑。

如果允许使用映射,您可以执行类似以下的简单操作(传入伪代码):

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

编辑:你说你有LatLng而不是整数-我不知道LatLng,但在快速谷歌搜索后,我想尝试一下以下内容,假设你想“添加”你的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
对于列表1中的每个板条x,请执行以下操作
如果不是m.containsKey(x)
m、 put(x,x)
其他的
m、 put(x,LatLng.newInstance(m.get(x).getLatitude()+x.getLatitude(),
m、 get(x.getLongitude()+x.getLongitude())
恩迪夫
完成

我在这里看到的唯一问题是这
m.containsKey(x)
取决于
equals
的正确实现,正如其他海报所说,在阅读后,我不确定这一点,你不能在迭代时删除。即使有“技巧”,在迭代时弄乱集合肯定会导致奇怪的运行时错误

不管怎么说,你在这个问题上太努力了

下面是一个快速而肮脏的解决方案,其中包含一小部分代码:

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());
}
private List sumAndUniqDuplicates(列表){
LinkedHashMap lookup=新建LinkedHashMap();
for(整数值:列表){
整数prevValue=lookup.get(值);
prevValue=(prevValue==null)?0:prevValue;
lookup.put(value,prevValue+value);
}
返回新的ArrayList(lookup.values());
}

关于如何克服这个问题有什么建议吗?即使我没有第一次删除,我的意思是在list2.isEmpty块中,它仍然会给我错误。关于如何实现它有什么建议吗?作为旁注,建议参考接口而不是具体实现(即write List list1=new ArrayList();)问题是我不能使用Map,我实际上在使用google maps,我有LatLng点而不是Integer,所以当我想用LatLng点在Map上得到一些东西时,它返回null:(这是我尝试的,它在覆盖equals方法后工作。谢谢你的回答。
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());
}