如何在 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() == 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());
}
这有效地否定了上述问题。
有时只需问一个问题,您就可以自己找到答案!
如果有人能向我解释比我理解的更好,我将推迟接受我自己的答案。
您的代码中的问题是您将无限期地添加元素 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());
}
我的教授要求我使用 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() == 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());
}
这有效地否定了上述问题。
有时只需问一个问题,您就可以自己找到答案!
如果有人能向我解释比我理解的更好,我将推迟接受我自己的答案。
您的代码中的问题是您将无限期地添加元素 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());
}