2013-04-19 1 views
0

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

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

ответ

2

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

+0

Хммм ... Я думал об этом. Проблема в том, что первый узел печатает, когда число элементов> 1. Если я загрузил foreach, я бы получил два из первого узла. –

+0

ok, давайте сделаем это тогда. Удалите цикл и попытайтесь распечатать узел + node.next + ... массив из трех узлов. –

+0

также в текущем коде .. что getData returrn, если ничего не было выделено ему после создания нового узла? –