-1

これが私のコードです:

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 を使用しようとしましたが、それが見つかりました.next() は前回削除された値を返します! どうすれば修正できますか?

4

2 に答える 2

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());
    }
}
于 2014-09-15T09:41:40.937 に答える