Почему комбинация hasPrevious () и add () в listiterator входит в бесконечный цикл, а hasNext () и add () - нет? - PullRequest
3 голосов
/ 13 января 2020

ArrayList с двумя элементами

     ArrayList<String> a = new ArrayList<String>() { 
        {
            add("hai");
            add("hello");
        }
    };

создал итератор списка для этого списка

   ListIterator l = a.listIterator();

обход с использованием следующего и добавление элемента "пока" в список

   while (l.hasNext()) {              

        l.next();
        l.add("bye");

    }
    System.out.println(a);

Вывод кода выше = [привет, привет, пока]

переход к последнему из списка

    while(l.hasNext()) {             
        l.next();
    }

переход вперед с использованием prev и добавление элемента "пока" в список

    while (l.hasPrevious()) {         

        l.previous();
        l.add("bye");

    }
    System.out.println(a);

Идет бесконечно и ничего не печатает !!!

1 Ответ

5 голосов
/ 13 января 2020

Ну, Javado c из ListIterator s add объясняет, что:

Вставляет указанный элемент в список (необязательная операция). Элемент вставляется непосредственно перед элементом, который будет возвращен next, если есть, и после элемента, который будет возвращен предыдущим, если таковой имеется. (Если список не содержит элементов, новый элемент становится единственным элементом в списке.) Новый элемент вставляется перед неявным курсором: последующий вызов next не будет затронут, а при последующем вызове previous новый элемент .

l.previous возвращает элементы, которые вы только что добавили с помощью l.add("bye"), поэтому вы никогда не достигнете начала List. Следовательно, бесконечность l oop.

Если List выглядит следующим образом:

hai       hello
                    ^
                    |
                  cursor

вызов l.previous(); возвращает "привет" и перемещает курсор назад:

hai            hello
        ^
        |
      cursor

вызов l.add("bye"); добавляет новый элемент между "hai" и "hello" и перед курсором:

hai      bye      hello
              ^
              |
            cursor

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

Поэтому ваш l oop никогда не достигнет начала List.

...