Die Iterator-Schnittstelle

8

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.

    
Henrik Hillestad Løvold 12.03.2013, 15:21
quelle

4 Antworten

5

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%     
Caesar Ralf 12.03.2013, 15:45
quelle
5

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.

    
Frank 12.03.2013 15:24
quelle
2

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).

    
Javier 12.03.2013 15:25
quelle
2

Um etwas Code zu reduzieren und es lesbarer zu machen

  • Benenne temp in next ,
  • um
  • verwenden Sie die Abkürzungsnotation,
  • sollte wahrscheinlich ein Konzept von current node,
  • haben

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 .

    
Edwin Buck 12.03.2013 15:59
quelle