ListIterator предыдущий () и следующий () результат - PullRequest
0 голосов
/ 19 февраля 2019

результат равен

ABCD

DC C2 B2 BA

Почему не получается

AB B2 CD

DC C2B2 BA в первый раз?

Я сделал li.add ("B2"), если word.equals "B".Разница только в следующем () и предыдущем ()?Я хочу знать ответ, пожалуйста.

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 голосов
/ 19 февраля 2019

Вы можете увидеть изменение списка, изменив свой отпечаток на использование 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]
0 голосов
/ 19 февраля 2019

Я думаю, что ответ на ваш вопрос здесь - 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
0 голосов
/ 19 февраля 2019

См. ListIterator.add (E) :

... Элемент вставляется непосредственно перед элементом, который будет возвращен следующим () ...

Таким образом, в вашей первой итерации добавление B2 не станет следующим в списке.

0 голосов
/ 19 февраля 2019

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

Причина заключается в том, что при добавлении элемента в итератор происходит не изменение элемента next(), а только previous().Таким образом, когда вы добавляете «B2» и «C2», он будет восприниматься только previous() вызовами.И именно поэтому первая итерация не собирает B2 и C2, а вторая обратная итерация выбирает их обоих.

0 голосов
/ 19 февраля 2019

JavaDoc для ListIterator#add определяет поведение:

 * 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.

Где путаница?

...