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

camsedfj  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(376)

我的教授让我在一张table中间加一个物体 ArrayedList<Employee> 使用listiterator。
我首先尝试了以下方法:

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) 进行评估。
我找到了一个解决方案,在其中添加了 break 刚好在…之后 li.add(emp_M) 继续以相同的方式单独解析列表,但不添加到列表中 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 ?

nmpmafwu

nmpmafwu1#

代码中的问题是要添加元素 emp_M 无限期地。
如果我们经过一次迭代,您添加了一个元素:
假设 li.nextIndex() == 5 ,然后您将向迭代器中添加一个新元素,并且根据add的文档,您还将增加一个索引(因此您将迭代器移到右侧)。然后循环继续,用 li.previous() ,它恰好位于添加元素之前(并验证要添加的if条件)。
现在,开始while循环的新迭代,再次验证条件,添加新元素等等。。。通过无限期地添加新元素,您将停留在验证条件的元素上。
为了使代码更简单,请尝试按文档方向运行迭代器(即 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());
}
gt0wga4j

gt0wga4j2#

我在调试器中深入挖掘后找到了它。
在添加之前 li.nextIndex() == 5 以及 li.previousIndex() == 4 添加对象后,前面提到的更改 li.nextIndex() == 6 以及 li.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());
        }

这实际上否定了上述问题。
有时只要问一个问题,你就能自己找到答案!
如果有人能比我理解的更好地向我解释,我会推迟接受我自己的答案。

相关问题