如何在 ListIterator(反向)迭代期间正确添加对象?

How to add an object during ListIterator (reversed) iteration properly?

我的教授要求我使用 listiterator 在 ArrayedList<Employee> 的中间添加一个对象。

我先尝试了以下方法:

ListIterator < Employee > li = emps.listIterator(emps.size());

System.out.println("\nUsing ListIterator:\n");

i = 1;
while (li.hasPrevious()) {
    if (li.nextIndex() == 5) {
        li.add(emp_M);
    }

    System.out.println("  Employee " + (i++) + " " + li.previous());
}

但这会产生看似无限次的迭代,其中 li.nextIndex() 卡在了 5 次。 我已经用调试器验证了这一点,并且只有在评估 li.add(emp_M) 之后才会发生这种情况。

我找到了一个解决方案,我在 li.add(emp_M) 之后添加了一个 break 并继续以相同的方式分别解析列表,但根本没有添加到列表 emp_M 中:

//parse in two loops to add the middle employee, without the break the list seemingly spirals into infinity!
System.out.println("\nUsing ListIterator:\n");
i = 1;
while (li.hasPrevious()) {
    if (li.nextIndex() == 5) {
        li.add(emp_M);
        System.out.println("ADDED IN MIDDLE");
        break;
    }
    System.out.println("  Employee " + (i++) + " " + li.previous());
}

while (li.hasPrevious()) {
    System.out.println("  Employee " + (i++) + " " + li.previous());
}
        

这让我想知道,我这样做是不是懒惰和幼稚的做法?我还能如何使用 listIterator 添加到列表?

我在调试器中深入挖掘后找到了它。

在添加 li.nextIndex() == 5li.previousIndex() == 4 之前的时刻 添加对象后,上述更改 li.nextIndex() == 6li.previousIndex() == 5 这是因为 listIterator 的 .add().next().

之前插入对象

继续解决这个问题会建立一个来回循环,其中 li.previous()li.previousIndex()li.nextIndex() 都减 1,调用 li.add(emp_M) 会增加上述两个值1.

要修复它,我们需要跳过添加后添加的元素:

 System.out.println("\nUsing ListIterator:\n"); 
        i = 1;
        while (li.hasPrevious())
        {
            if(li.nextIndex() == 5)
            {
                li.add(emp_M);
                li.previous();
                System.out.println("ADDED IN MIDDLE");
//              break;
            }
            System.out.println("  Employee " + (i++) + " " + li.previous());
        }

这有效地否定了上述问题。

有时只需问一个问题,您就可以自己找到答案!

如果有人能向我解释比我理解的更好,我将推迟接受我自己的答案。

您的代码中的问题是您将无限期地添加元素 emp_M

如果我们在您添加元素的地方进行一次迭代:

假设 li.nextIndex() == 5,然后你将向迭代器添加一个新元素,根据 add 的文档,你的索引也会增加一个(因此你将迭代器移动到正确的)。然后你的循环继续,你用 li.previous() 将你的迭代器移动到左边,它恰好在你添加元素之前放置(并验证要添加的 if 条件)。

现在,您开始 while 循环的新迭代,再次验证条件,添加新元素等...您将停留在通过添加无限新元素来验证条件的元素。

为了使代码更简单,尝试 运行 你的迭代器在 documentation 方向(即 e1 -> e2 -> e3 -> e4

ListIterator < Employee > li = emps.listIterator();

i = 1;
while (li.hasNext()) {
    if (li.nextIndex() == 5) {
        li.add(emp_M);
    }

    System.out.println("  Employee " + (i++) + " " + li.next());
}