2016-07-21 7 views
1

Es gibt eine Klasse, die eine Schnittstelle implementiert Selector. Ich sollte iterator() in seinen Methoden verwenden.Unendliche Schleife, weil der Iterator sich nicht bewegt

private class SequenceSelector implements Selector { 
    private T obj = items.iterator().next(); 
    public boolean end() { return !items.iterator().hasNext(); } 
    public T current() { return obj; } 
    public void next() { obj = items.iterator().next(); } 
} 

items ist ein Arraylist. obj ist ein Wert, um das erste Sequenzglied vor dem ersten next() zu speichern.

Mit einem folgenden Code geht das Programm in eine Endlosschleife, in der nur das erste Mitglied der Sequenz gedruckt wird.

Warum passiert das? Obwohl ich next() Methode verwende, bewegt sich der Iterator nicht.

Antwort

6

Jedes Mal, wenn Sie items.iterator() aufrufen, erstellen Sie einen neuen Iterator.

Erstellen Sie einen Iterator am Anfang und verwenden Sie diesen wiederholt.

private class SequenceSelector implements Selector { 
    private final Iterator<T> iterator = items.iterator(); 

    private T obj = iterator.next(); 
    public boolean end() { return !iterator.hasNext(); } 
    public T current() { return obj; } 
    public void next() { obj = iterator.next(); } 
}