Ich habe eine Universitätszuordnung, die erfordert, dass ich eine innere Klasse implementiere, die die Iterator-Schnittstelle implementiert. Der Iterator arbeitet an einer einfach verknüpften Listen-Oberklasse.
Momentan sieht meine innere Klasse so aus:
%Vor%Nun ist mein Problem, dass die Methode hasNext () true zurückgibt, selbst wenn die Liste tatsächlich leer ist. Alles andere scheint zu funktionieren. Ich habe wahrscheinlich irgendwo einen logischen Fehler übersehen, aber ich kann es selbst nicht finden.
Ihre Implementierung wurde so geändert, dass sie den Iterator-Vertrag widerspiegelt. Sie müssen daran denken, dass Sie in der Lage sein müssen, alle Elemente der Sammlung zu durchlaufen, dh next()
sollte vom ersten Element ausgehen und nach jedem Aufruf muss das aktuelle nächste Element zum nächsten Element in der Liste oder dem Wurf geändert werden eine Ausnahme, wenn es keine gibt.
Es ist gut, das Iterator-Interface-Dokument zu lesen, um den Inhalt zu verstehen So müssen Sie es implementieren und von dort aus starten.
%Vor% Sie müssen verfolgen, wo Sie sich in Ihrer Liste befinden, ein cursor
implementieren, oder wenn Ihre Knoten in der verknüpften Liste ihre next
kennen, fragen Sie sie einfach, ob sie ein nächstes Element haben.
Wenn der Cursor größer ist als die Länge / Ihr Knoten hat keine next
Sie geben false in hasNext () zurück.
Mach das alles in deiner hasNext()
-Methode. Denken Sie daran, es ist in Ordnung, wenn next () eine Ausnahme auslöst, wenn hasNext()
falsch wäre - also müssen Sie sicherstellen, dass es nur eine Ausnahme auslöst.
Da ich die zugrunde liegende Datenstruktur Ihrer Liste nicht kenne, kann ich Ihnen nicht sagen, welche davon besser ist.
hasNext
gibt "true" zurück, wenn der aktuelle Knoten ( temp
) nicht null
ist.
Wenn Ihre Implementierung der verknüpften Liste einen Header-Knoten verwendet, erhält der Konstruktor immer fo!=null
und hasNext
gibt true
zurück, obwohl die Liste leer ist. Sie sollten diese Tatsache in Ihrer Implementierung berücksichtigen.
Basierend auf Ihrem Code scheint es, dass
%Vor% kann den Trick machen (wenn header.getNext()==null
für eine leere Liste).
Um etwas Code zu reduzieren und es lesbarer zu machen
temp
in next
, current
node, Das Update sieht folgendermaßen aus:
%Vor% Das Löschen könnte den aktuellen Wert auf null setzen. Wir brauchen keine Flagge (vorausgesetzt, dass wir nichts tun, wenn eine Person löscht, bevor sie den ersten getNext()
aufruft. Zum Teufel, wenn wir wirklich nach dem Gold greifen wollen, lässt remove()
einen% co_de werfen % if IllegalStateException
.
Tags und Links java iterator linked-list iterable