Java Iterator не работает с одним итерируемым объектом

У меня проблема с итераторами. Я пишу пользовательский связанный список как использование итератора, чтобы иметь возможность просматривать список.

Итератор выглядит так:

public class NodeIterator implements Iterator<Node> {
private Node current = head;
private Node lastReturned = head;

public boolean hasNext() {
    return lastReturned.getLink() != null;
}

public Node next() {
    lastReturned = current;
    current = current.getLink();
    return lastReturned;
}

public void remove() {
    removeNode(lastReturned);
    lastReturned = null;
}
}

Я все еще на начальных этапах, поэтому я тестирую структуры данных из консоли, заполняя узлы этим методом.

private static void MethodToPopulateNodes() {
MyObject o = new MyObject();
String[] responses = new String[prompts.length];
scanner = new Scanner(System.in);

boolean done = false;
String s = null;

while (!done) {
    int i = 0;
    for (String prompt : prompts) {
        System.out.println(prompt);
        s = scanner.nextLine();
        if (s.equalsIgnoreCase("stop")) {
            done = true;
            break;
    } else {
        responses[i] = s;
    }
        i++;
    }
    if (done) {
        break;
    }
        o = new MyObject(responses);
        myNode.add(c);
}
}

Когда я пытаюсь использовать итератор, когда есть только один узел, он ничего не делает. Никаких ошибок или чего-либо еще. Однако, если у меня несколько узлов, этот foreach работает безупречно.

public static void main(String[] args) {
myNode = new Node();

methodToPopulateLinkedList();

for (Node node : myNode) {
        //toString is overridden for my object
    System.out.println(node.getData().toString());
}

}

ОБНОВЛЕНИЕ: я отредактировал итератор, чтобы вернуть hasNext() == true на первой итерации:

public class NodeIterator implements Iterator<Node> {
private boolean done = false;
private Node current = head;
private Node lastReturned = head;

public boolean hasNext() {
    if (head == tail && head != null && !done) {
    done = true;
    return true;
    }
    return lastReturned.getLink() != null;
}

public Node next() {
    lastReturned = current;
    current = current.getLink();
    return lastReturned;
}

public void remove() {
    removeNode(lastReturned);
    lastReturned = null;
}
}

Я чувствую, что это супер дерганный, но это работает. Похоже на вызовы Java hasNext() сначала, прежде чем позвонить дальше, поэтому я должен относиться к особому случаю по-другому.

| 123

hasNext() == true
next() == 1

1 | 23

hasNext() == true
next() == 2

12 | 3

куда | равняется курсору. Это точно? Есть ли лучший способ решить эту проблему?

1 ответ

Если есть только один узел, у него будет особый случай, когда его -> следующий будет нулевым. Перед циклом попробуйте распечатать первый узел, я думаю, что ваш цикл может быть впереди.

Другие вопросы по тегам