我的教授让我在一张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
?
2条答案
按热度按时间nmpmafwu1#
代码中的问题是要添加元素
emp_M
无限期地。如果我们经过一次迭代,您添加了一个元素:
假设
li.nextIndex() == 5
,然后您将向迭代器中添加一个新元素,并且根据add的文档,您还将增加一个索引(因此您将迭代器移到右侧)。然后循环继续,用li.previous()
,它恰好位于添加元素之前(并验证要添加的if条件)。现在,开始while循环的新迭代,再次验证条件,添加新元素等等。。。通过无限期地添加新元素,您将停留在验证条件的元素上。
为了使代码更简单,请尝试按文档方向运行迭代器(即
e1 -> e2 -> e3 -> e4
)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。要解决此问题,我们需要在添加后跳过添加的元素:
这实际上否定了上述问题。
有时只要问一个问题,你就能自己找到答案!
如果有人能比我理解的更好地向我解释,我会推迟接受我自己的答案。