这是我的代码:
public class Test {
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList();
list.add(1);
list.add(2);
list.add(2);
list.add(2);
list.add(5);
int inteval = 0;
Iterator<Integer> it = list.iterator();
for(;it.hasNext();){
Integer n = it.next();
list.remove(n);
if (list.contains(n-inteval)){
list.remove(list.indexOf(n-inteval));
if (list.contains(n-inteval-inteval)){
list.remove(list.indexOf(n-inteval-inteval));
}else{
list.add(n-inteval);
list.add(n);
}
}
}
}
}
此代码将抛出ConcurrentModificationException,我尝试使用CopyOnWriteArrayList,但我发现it.next()返回上次删除的值!我怎么修理它?
答案 0 :(得分:0)
这是因为您正在执行以下操作:
Iterator<Integer> it = list.iterator();
for(;it.hasNext();){
Integer n = it.next();
list.remove(n);
使用Iterator
时,您无法使用list
,list.remove()
功能修改list.add()
。要使用迭代器删除元素,您需要调用it.remove()
,这将删除使用it.next()
获得的元素。如果您真的想这样做,那么您应该执行以下操作:
for(int i = 0; i < list.size(); i++){
Integer n = list.get(i);
...
虽然您还需要确保在修改列表并且元素来回推送时,您只需检查一次元素。您可能更容易使用所需的元素构建不同的列表。
答案 1 :(得分:0)
使用任何list方法获取Iterator后,不应修改列表。
正如已经指出的那样 - 在Iterator实例上调用remove方法。
例如 -
public class Test {
public static void main (String... at) throws Exception {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(2);
list.add(5);
Iterator<Integer> it = list.iterator();
//below while will remove every element from the list
while (it.hasNext()) {
it.next();
it.remove();
}
//this will leave 5 as the only element in list
/*while (it.hasNext()) {
if (it.next() != 5) {
it.remove();
}
}*/
//below loop will remove all the occurences of 1 or 2
while (it.hasNext()) {
Integer number = it.next();
if (number == 1 || number == 2) {
it.remove();
}
}
System.out.println(list.toString());
}
}