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

Rah*_*hvi 0 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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是输出

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
Run Code Online (Sandbox Code Playgroud)

我需要利用当前 listIterator 中最近添加的元素,但无法做到这一点。

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

das*_*ght 6

当您调用adda时ListIterator<T>,它会将元素放置在紧邻将返回的元素之前next()

文档中:

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

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

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