ConcurrentModification при добавлении элемента в ArrayList - PullRequest
0 голосов
/ 07 мая 2018

Я новичок в Java и у меня проблема с одной задачей.
Я пытаюсь добавить элемент в ArrayList, но есть исключение: Исключение в потоке "main" java.util.ConcurrentModificationException

    public Anagrams (String path) throws FileNotFoundException {
    List<String> tmpList = new ArrayList<>();

    Scanner scan = new Scanner(new File(path));
    while(scan.hasNext()) {
      tmpList.add(scan.next());
    }
    scan.close();

    tmpList.forEach(word -> {
        if(anList.isEmpty()) {
            ArrayList<String> tmp1 = new ArrayList<String>();
            tmp1.add(word);
            anList.add(tmp1);
        } 
        else {
            anList.forEach(list -> {
                if (isAnagram(word, list.get(0))) {
                    list.add(word);
                } else {
                    ArrayList<String> tmp2 = new ArrayList<String>();
                    tmp2.add(word);
                    anList.add(tmp2);
                }
            });
        }
    });

}

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

1 Ответ

0 голосов
/ 07 мая 2018
anList.forEach(list -> {
            if (isAnagram(word, list.get(0))) {
                list.add(word);
            } else {
                ArrayList<String> tmp2 = new ArrayList<String>();
                tmp2.add(word);
                anList.add(tmp2); // !!
            }
        });

Как вы думаете, вызов forEach будет включать элементы, добавленные к anList в строке, которая комментируется // !!?

Java не знает, стоит ли это делать. Так кидает.

Выясните, как сделать что-то другое: добавьте, например, в другой список.

...