为什么我的迭代器未正确遍历列表?

时间:2018-11-06 00:17:27

标签: java

我正在尝试了解迭代器和链接列表。因此,就像我通常所做的那样,我一直在玩弄代码,但无法弄清楚程序是如何遍历列表的。

    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。为什么会这样?

2 个答案:

答案 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。)