我正在尝试了解迭代器和链接列表。因此,就像我通常所做的那样,我一直在玩弄代码,但无法弄清楚程序是如何遍历列表的。
LinkedList<String> matchedList = new LinkedList<>();
matchedList.addFirst("Cowabunga");
ListIterator<String> iterator = matchedList.listIterator();
iterator.add("Reee");
iterator.add("Moo");
System.out.println(matchedList);
System.out.println(iterator.previous());
System.out.println(iterator.previous());
作为输出,我得到:
[Reee, Moo, Cowabunga]
java.util.LinkedList$ListItr@15db9742
Moo
Reee
但是我很困惑。我认为光标最初位于以下各项之间:“ Cowabunga”和“ Ree”,其中Cowabunga是列表中的第一个元素。这是由于将链接列表链接在一起。但是,作为输出,当我去前两次时,我得到Moo,然后得到Ree。为什么会这样?
答案 0 :(得分:3)
首先,顺便说一句,您的代码中必须有一个额外的打印语句,用于在其中打印Threshold:1
Infectious Period:2
Display:2
s
,以解释输出ListIterator
。
接下来,java.util.LinkedList$ListItr@15db9742
(和ListIterator
)的初始位置在第一个元素之前 ,在该位置,the add
method将元素添加到该位置。>
将指定的元素插入列表(可选操作)。该元素将立即插入next()返回的元素之前(如果有的话),再插入previous()返回的元素之后(如果有的话)。
新元素将插入到隐式光标之前:对next的后续调用将不受影响,而对previous的后续调用将返回新元素。
因此,当您创建Iterator
时,这就是状态,迭代器的“光标”位置在第一个元素之前。
ListIterator
使用迭代器添加元素时,即使在位置之前添加了更多元素,该位置仍位于同一元素之前:
list: "Cowabunga"
itr ^
然后 list: "Reee" -> "Moo" -> "Cowabunga"
itr ^
方法将元素返回到位置之前,并将其向后移动。
previous()
答案 1 :(得分:0)
请参阅https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html#add(E)
将指定的元素插入列表(可选操作)。的 元素将立即插入 由next()返回(如果有的话),然后是 由previous()返回(如果有)。 (如果列表不包含任何元素,则 新元素成为列表上唯一的元素。)新元素是 插入隐式光标之前:对next的后续调用 不会受到影响,随后对上一个的调用将返回新的 元素。(此调用将返回的值增加一 通过调用nextIndex或previousIndex。)