ConcurrentmodificationException, выдаваемый Java-кодом - PullRequest
0 голосов
/ 12 ноября 2011

Я пытаюсь добавить один список в другой.Это вызывает исключение Concurrent Modification в цикле while, где я вызываю addAll () для добавления элементов списка разрешений в outvec.Мне нужно уменьшить размер списка p в объекте perm, а затем добавить определенную его часть в outvec.Таким образом, это повторяется до тех пор, пока число элементов в списке p объекта perm <= 1. Вот как выглядит мой код: </p>

import java.util.Collections;
import java.util.List;

public class Generate {

    //function to generate the output vector
    ListGenerator gen(ListGenerator perm, double frac, int n) {
        ListGenerator outvec = new ListGenerator();
        for(int i = 0; i < n; i++)
            perm.p.add(i, i+1);
        outvec.p = perm.p;
        //System.out.println("p in gen function: " + p);
        randomPerm(perm);
        int x = perm.p.size();
        while( x > 1)
        {
            perm.p = firstFP(frac, perm);
            System.out.println("perm.p after firstFP call " + perm.p);
            outvec.p.addAll(perm.p);
            System.out.println("size of outvec: " + outvec.p.size());
            x = perm.p.size();
        }
        return outvec;
    }

    //function to generate random permutation of numbers
    private  void randomPerm(ListGenerator perm) {
        Collections.shuffle(perm.p);
        //System.out.println("perm in randomPerm function: " + p);
    }


    //function to return first f*|p| number of elements from p
    List<Integer> firstFP(double f, ListGenerator perm) {
        int new_size = (int) (f * perm.p.size());
        return( perm.p.subList(0, new_size));
    }

    public static void main(String args[]) {
        Generate g = new Generate();
        ListGenerator p = new ListGenerator();
        ListGenerator outvec = new ListGenerator();
        double frac = 0.3;
        int N = 70000;
        outvec = g.gen(p, frac, N);
        System.out.println("outvec: " + outvec.p);
        System.out.println("size of outvec: " + outvec.p.size());
}
}

import java.util.ArrayList;
import java.util.List;

public class ListGenerator {
    List<Integer> p = new ArrayList<Integer>();
}

Проблема заключается в том, что в outvec возникает исключение ConcurrentModificationException.p.addAll (температура);это утверждение.Вот что я получаю:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$SubList.checkForComodification(Unknown Source)
    at java.util.ArrayList$SubList.size(Unknown Source)
    at Generate.gen(Generate.java:17)
    at Generate.main(Generate.java:49)

Любое руководство будет высоко оценено.

1 Ответ

2 голосов
/ 12 ноября 2011

Ваш код не компилируется, и ошибка не в этой части кода.

Параллельное исключение обычно происходит, когда вы перебираете список или другую структуру и удаляете или добавляете некоторые элементы одновременновремя в том же списке.

...