如何在下面的代码中避免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());
}