LisIterator有add()但不会迭代新添加的元素

时间:2018-04-02 17:04:19

标签: java list listiterator

我正在使用ListIterator迭代列表,因为如果满足某些条件,我想在运行时添加一些元素。

但是添加到列表中的新元素永远不会包含在迭代器

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

public class Example {
    public static void main(String[] s)
    {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(5);
        list.add(6);

        ListIterator<Integer> listIterator = list.listIterator();
        while(listIterator.hasNext())
        {
            int i = listIterator.next();
            System.out.println("List Element: " + i + " | List size: " + list.size());
            if(i==1)
            {
                //Adding '3' to list
                listIterator.add(3);
                System.out.println("Added Element: 3");
            }
            if(i==2)
            {
                //Adding '4' to list
                listIterator.add(4);
                System.out.println("Added Element: 4");
            }
        }
    }
}

以下是输出

List Element: 1 | List size: 4
Added Element: 3
List Element: 2 | List size: 5
Added Element: 4
List Element: 5 | List size: 6
List Element: 6 | List size: 6

我需要使用当前listIterator中最近添加的元素,但无法执行此操作。

是否有其他方法可以在同一个迭代会话中迭代新元素?

2 个答案:

答案 0 :(得分:4)

当您在add上致电ListIterator<T>时,它会将元素放在next()返回的元素的前面:

来自documentation

  

在隐式游标之前插入新元素:对next()的后续调用不受影响,随后对previous()的调用将返回新元素。

此API设计背后的逻辑是游标是双向的。它没有指示您迭代它的方向,因此其设计者需要决定哪两个方向next()previous()将包含新添加的元素,因此他们决定在previous()

如果您希望光标迭代新添加的元素,请在插入后立即调用previous()

答案 1 :(得分:0)

我们可以使用for循环来迭代并同时将元素添加到循环的末尾

for (int i = 0; i < list.size(); i++) {
    int element = list.get(i);
    if(element == 1){
        System.out.println(element);
        list.add(3);

    }
    else if(element == 2){
        System.out.println(element);
        list.add(4);
    }
    else
        System.out.println(element);
}
System.out.println(list);

输出:

1
2
5
6
3
4
[1, 2, 5, 6, 3, 4]