ListIterator previous()和next()结果

时间:2019-02-19 11:39:21

标签: java listiterator

结果是

A B C D

D C C2 B2 B A

为什么没有结果

A B B2 C D

首先是D C C2 B2 B A吗?

如果word.equals“ B”我做了li.add(“ B2”)。 next()和previous()之间只是区别吗?我想知道答案。

public static void main(String[] args) {

    List<String> list = Arrays.asList("A", "B", "C", "D");
    list = new ArrayList<>(list);
    ListIterator<String> li = list.listIterator();
    String word;

    while (li.hasNext()) {
        word = li.next();
        System.out.print(word + '\t');
        if (word.equals("B"))
           li.add("B2");
    }

    System.out.println();

    while (li.hasPrevious()) {
        word = li.previous();
        System.out.print(word + '\t');
        if (word.equals("C"))
            li.add("C2");
    }
}

5 个答案:

答案 0 :(得分:1)

请参见ListIterator.add(E)

  

...元素立即插入前,next()将返回该元素...

因此,在您的第一次迭代中,添加B2不会成为列表中的下一个。

答案 1 :(得分:1)

https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html

原因是,当您将元素添加到迭代器时,这不会更改next()元素,而只会更改previous()。因此,当您添加“ B2”和“ C2”时,它们只会被previous()调用拾取。这就是为什么第一次迭代不选择B2和C2,而第二次向后迭代同时选择了它们。

答案 2 :(得分:0)

ListIterator#add的JavaDoc指定行为:

 * Inserts the specified element into the list (optional operation).
 * The element is inserted immediately before the element that
 * would be returned by {@link #next}, if any, and after the element
 * that would be returned by {@link #previous}, if any.  (If the
 * list contains no elements, the new element becomes the sole element
 * on the list.)  The new element is inserted before the implicit
 * cursor: a subsequent call to {@code next} would be unaffected, and a
 * subsequent call to {@code previous} would return the new element.

混乱在哪里?

答案 3 :(得分:0)

我认为您的问题的答案在这里-https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html#add(E)

  

该元素紧接在next()返回的元素之前(如果有的话),然后插入到previous()返回的元素之后(如果有的话)。

     

新元素将插入到隐式光标之前:对next的后续调用将不受影响,而对previous的后续调用将返回新元素。

在第一个循环中,当单词等于“ B”时,隐式光标位于“ B”和“ C”之间,根据文档说明,新元素将添加在其之前。

A    B       C     D
       ^   ^ 
      B2  cursor

答案 4 :(得分:0)

通过将打印更改为使用nextIndex,您可以看到列表更改

System.out.print(list.get(li.nextIndex()) + "["+ li.nextIndex()+ "]" +'\t');


while (li.hasNext()) {
    System.out.print(list.get(li.nextIndex()) + "["+ li.nextIndex()+ "]" +'\t');
    word = li.next();
    if (word.equals("B")) {
         li.add("B2");
    }
  }

System.out.println();

while (li.hasPrevious()) {
    word = li.previous();
    System.out.print(list.get(li.nextIndex()) + "["+ li.nextIndex()+ "]" +'\t');
    if (word.equals("C"))
        li.add("C2");
    }
}

这将输出

A[0]    B[1]    C[3]    D[4]     
D[4]    C[3]    C2[3]   B2[2]   B[1]    A[0]