Как удалить все элементы из ListIterator, а затем добавить новые - PullRequest
0 голосов
/ 18 января 2020

Как удалить все элементы из ListIterator, а затем добавить новые. Я получаю ConcurrentModificationException при добавлении в итератор в последней строке.

public static void doAction(List<String> list) {
    for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext(); ) {
        String s1 = iterator.next();
        if(s1.equals("XYZ")){
            while(iterator.hasNext()) {
                iterator.next();
                iterator.remove();
            }
            list.add("123");
            list.add("456");
            list.add("789");
            list.forEach(iterator::add);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Чтобы сделать то, что вы хотите сделать, внесите отмеченные изменения.


    List<String> list = ArrayList<>(List.of("ABC","DEF", "GHI", "XYZ", "JKL", "MNO"));

    public static void doAction(List<String> list) {
        for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext(); ) {
            String s1 = iterator.next();
            if(s1.equals("XYZ")){
                while(iterator.hasNext()) {
                    iterator.next();
                    iterator.remove();
                }
                list.add("123");
                list.add("456");
                list.add("789");
                break;            // add this
           //     list.forEach(iterator::add);  // delete this
            }
        }
    }

Он напечатает.

[AB C, DEF, GHI, XYZ, 123, 456, 789]

Но я считаю, что более чистый способ сделать это был бы.

     List<String> list = ArrayList<>(List.of("ABC","DEF", "GHI", "XYZ", "JKL", "MNO"));

     public static void doAction(List<String> list) {
        ListIterator<String> it = list.listIterator();
        while (it.hasNext()) {
            if (it.next().equals("XYZ")) {
                while (it.hasNext()) {
                    it.next();
                    it.remove();
                }
            }
        }
        list.add("123");
        list.add("456");
        list.add("789");
     }

0 голосов
/ 18 января 2020

Причина, по которой вы получаете исключение, заключается в том, что вы пытаетесь добавить его в список, пока выполняете его. List#forEach будет быстро терпеть неудачу и все равно будет выбрасывать ConcurrentModificationException в базовом списке, структурно измененном во время итерации (т.е. в вашем случае действие iterator::add).

Теперь для целей, которые вы хотите для достижения вашего метода его можно переписать и изменить следующим образом:

public static void doAction(List<String> list) {
     if (list.contains("XYZ")) {
         list.clear();
         list.add("123");
         list.add("456");
         list.add("789");
     }
}

Что гораздо проще и понятнее. Вы просто проверяете, присутствует ли искомое значение в заданном списке, а затем просто вызываете List#clear, который опустошит переданное в один. Затем вы добавите новые элементы, и вы хорошо к go.

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