Почему я не могу добавить в ListIterator, перебирая его? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь добавить ListIterator во время итерации по нему, но при проверке работоспособности hasNext () всегда возвращает false.

As javadoc утверждает, что ListIterator является "Итератором длясписки, которые позволяют программисту обходить список в любом направлении, изменять список во время итерации и получать текущую позицию итератора в списке. "однако, когда я пытаюсь добавить, я не получаю сообщение об ошибке и ListIterator не получает новый элемент.

public void foo() {
    List<String> bar = new ArrayList<String>();
    bar.add("foobar");
    ListIterator<String> quux = bar.listIterator();
    while(quux.hasNext()) {
        if(quux.next().equals("foobar")) {
            quux.add("baz");
        }
    }
}

В конце этой функции я ожидаю, что ListIterator будет содержать новую строку "baz",Однако когда я вызываю метод hasNext (), он возвращает false. Программа даже прошла if-Statement, просто оказалось, что add-метод не делает то, что должен делать.

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Похоже, вы ожидаете, что сможете получить добавленный элемент с помощью next():

, а ListIterator не получит новый элемент

[...]

В конце этой функции я ожидаю, что ListIterator будет содержать новую строку "baz". Однако, когда я вызываю метод hasNext (), он возвращает false

Однако JavaDoc для ListIterator.add () явно заявляет, что это не так:

Новый элемент вставляется перед неявным курсором: a последующий вызов next не будет затронут


Если вы хотите включить элемент витерацию вы можете перематывать список итератора на одну позицию:

    if(quux.next().equals("foobar")) {
        quux.add("baz");
        quux.previous();
    }
0 голосов
/ 16 октября 2019

Ваш код работает (после исправления пропущенного () после new ArrayList<String> и замены == на правильный метод сравнения строк, equals:

import java.util.*;

public class test
{
    public static void main(String[] args) {
        List<String> bar = new ArrayList<String>();
        bar.add("foobar");
        ListIterator<String> quux = bar.listIterator();
        while(quux.hasNext()) {
            if(quux.next().equals("foobar")) {
                quux.add("baz");
            }
        }
        System.out.println(bar);
    }
}

возвращает:

[foobar, baz]

Как видите, baz были вставлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...