ConcurrentModificationException При удалении элемента с помощью итератора списка Java - PullRequest
2 голосов
/ 22 апреля 2019

У меня проблема с удалением 1-го и 2-го элемента моего списка даже с помощью итератора.

Я прочитал следующие темы, но не могу решить мою проблему (они были наиболее важными, но я также проверил и другие материалы):

ConcurrentModificationException при попытке удалить элемент из списка

Итерация по коллекции, исключение ConcurrentModificationException при удалении объектов в цикле

Итак, мой код выглядит так:

    List<List<String>> list = cnf.read();
    List<List<String>> nlist = new ArrayList<>();
    for (List<String> l : list) {
        if (l.size() <= 3) {
            nlist.add(l);
        } else {
            int size = l.size();
            while (size > 3) {
                List<String> three = l.subList(0, 2);
                three.add("Y" + (count++));
                //Iterator itr = l.iterator();
                ListIterator itr = l.listIterator();
                int v = 0;
                while (itr.hasNext()) {
                    itr.next();
                    if (v == 0 || v == 1){
                        itr.remove();
                        v++;
                    }
                }
                l.add(0, "Y" + (count++));
                size--;
                nlist.add(three);
            }
            nlist.add(l);
        }
    }
    for (List<String> l : nlist) {
        System.out.println(l.toString());
        System.out.println(l.size());
    }

Я получаю исключение ConcurrentModificationException в операторе печати здесь:

System.out.println (l.toString ());

Я пытался использовать итераторы для своих циклов 2 forтакже, но это, кажется, не имеет значения!Я новичок в публикации вопросов, поэтому дайте мне знать, если я делаю это правильно!Спасибо.

1 Ответ

0 голосов
/ 22 апреля 2019

После долгой отладки, вот решение.

Функция подсписка проходит по ссылке, а не по значению, подсписок, созданный вызовом ArrayList.subList, сохраняет ссылку на исходный список и обращается к его массиву elementData.напрямую.

По этой причине при добавлении элемента в список «три» мы изменяем состояние исходного списка.это происходит здесь:

three.add ("Y" + (count ++));

Способ исправить это для этого конкретного случая - создать и инициализировать«три» перечисляют следующим образом:

                String one = l.get(0);
                String two = l.get(1);
                List<String> three = new ArrayList<>();
                three.add(one);
                three.add(two);
                three.add("Y" + (count));

Это позволяет нам манипулировать нашими списками без получения исключений параллелизма (ConcurrentModificationException).Однако, если вы манипулируете большими списками, я бы предложил вам использовать другой менее жесткий код для создания списков.

Я отмечу эту ветку как ответившую и надеюсь, что она поможет людям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...