Модификация и печать ArrayList во время итерации - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь изменить и распечатать измененный список одновременно.Ниже приведен пример кода:

public class Test {

    static List<Integer> l = new ArrayList<Integer>()
    {{
        add(1);
        add(2);
        add(3);
        add(4);
        add(5);
    }};
    public static void main(String args[])
    {
        performTask();
    }

    private static void performTask()
    {
        int j = 0;
        ListIterator<Integer> iter = l.listIterator();
        while(iter.hasNext())
        {
            if(j == 3)
            {
                iter.add(6);
            }
            System.out.println(l.get(j));
            iter.next();
            ++j;
        }
    }
}

Я ожидаю вывод как 1,2,3,6,4,5, но вывод 1,2,3,6,4.Также, если я хочу получить вывод как 1,2,3,4,5,6 как код должен быть изменен?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Тема ответа xtratic - блестящая (спасибо, бро) с точки зрения демонстрации того, что нужно сделать для удовлетворения требований OP, но код не справляется со своей задачей, поэтому размещение этого кода, как и хотел OP,

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
for (int index = 0; index < list.size(); index++) {
    final Integer val = list.get(index);
    if (index == 3) { // index doesn't have to be compared with 3 and instead it can be compared with 0, 1 or 2 or 4
        list.add(5, 6); // we need to hardcodingly add 6 at 5th index in list else it will get added after 4 and will not be in sequence
    }
    System.out.println(val);
}

Это выводит следующую последовательность,

1
2
3
4
5
6

Внутри цикла, если мы сделаем это,

list.add(index+1, 6);

Тогда это приведет к неправильной последовательности, поскольку 6 добавляется в 4-й индекс.

1
2
3
4
6
5
0 голосов
/ 11 октября 2018

Я бы на самом деле воздержался от Iterator в этом случае.Вместо этого попробуйте код, подобный следующему:

List<Integer> list = ...;
for (int index = 0; index < list.size(); index++) {
    final Integer val = list.get(index);
    // did you want to add something once you reach an index
    // or was it once you find a particular value?  
    if (index == 3) {
        // to insert after the current index
        list.add(index + 1, 6);
        // to insert at the end of the list
        // list.add(6);
    }
    System.out.println(val);
}

Поскольку цикл for сравнивает i с size() каждой итерации, а size() обновляется при добавлении элемента в список, при этом правильно печатаетсяновые вещи, которые добавляются в список (если они добавляются после текущего индекса).

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