我有一个包含重复值的整数列表。我需要做的是找到重复的整数,添加它们的值,然后通过删除找到的重复项将结果添加到列表中。这就是我在做的事情:
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
感谢您的时间。
答案 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())
中的第一次(因为list2
在else
正文的开头和之后是空的。
答案 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)
您无法删除当前元素两次。你需要重新思考你的逻辑。