У меня проблема с итераторами. Я пишу настраиваемый связанный список, используя итератор, чтобы иметь возможность перемещаться по списку.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());
}
}
UPDATE: Я редактировал итератор для возврата 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;
}
}
Я чувствую, что это супер Janky, но это работает. Кажется, что Java вызывает hasNext()
, прежде чем звонить дальше, поэтому я должен рассматривать особый случай по-другому.
| 123
hasNext() == true
next() == 1
1 | 23
hasNext() == true
next() == 2
12 | 3
Где |
равно курсор. Это точно? Есть ли лучший способ решить эту проблему?
Хммм ... Я думал об этом. Проблема в том, что первый узел печатает, когда число элементов> 1. Если я загрузил foreach, я бы получил два из первого узла. –
ok, давайте сделаем это тогда. Удалите цикл и попытайтесь распечатать узел + node.next + ... массив из трех узлов. –
также в текущем коде .. что getData returrn, если ничего не было выделено ему после создания нового узла? –