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