Wenn ich eine Liste [alice, bob, abigail, charlie]
habe, die einen Iterator enthält, und ich möchte ihn so schreiben, dass er über Elemente iteriert, die mit 'a' beginnen, kann ich dann meinen eigenen schreiben? Wie kann ich das machen ?
103
Antworten:
Sicher. Ein Iterator ist nur eine Implementierung der
java.util.Iterator
Schnittstelle. Wenn Sie ein vorhandenes iterierbares Objekt (z. B. aLinkedList
) von verwendenjava.util
, müssen Sie es entweder in Unterklassen unterteilen und seineiterator
Funktion überschreiben , damit Sie Ihr eigenes zurückgeben, oder Sie können einen Standarditerator in Ihre spezielleIterator
Instanz einschließen (welche) hat den Vorteil einer breiteren Verwendung) usw.quelle
Iterator
Instanz ..." gemeint (und danke). :-)Die beste wiederverwendbare Option besteht darin, die Schnittstelle Iterable zu implementieren und den Methodeniterator () zu überschreiben.
Hier ist ein Beispiel für eine ArrayList-ähnliche Klasse, die die Schnittstelle implementiert, in der Sie die Methode Iterator () überschreiben.
Diese Klasse implementiert die Iterable-Schnittstelle mithilfe von Generics . Wenn Sie Elemente im Array haben, können Sie eine Instanz eines Iterators abrufen. Dies ist beispielsweise die benötigte Instanz, die von der "foreach" -Schleife verwendet wird.
Sie können einfach eine anonyme Instanz des Iterators erstellen, ohne einen erweiterten Iterator zu erstellen, und den Wert von currentSize nutzen, um zu überprüfen, bis zu welcher Stelle Sie über das Array navigieren können (nehmen wir an, Sie haben ein Array mit einer Kapazität von 10 erstellt, aber Sie haben nur 2 Elemente bei 0 und 1). Die Instanz hat ihren Eigentümerzähler, wo sie sich befindet, und alles, was Sie tun müssen, ist mit hasNext () zu spielen, das überprüft, ob der aktuelle Wert nicht null ist, und mit next (), das die Instanz Ihres currentIndex zurückgibt. Unten finden Sie ein Beispiel für die Verwendung dieser API ...
Wenn Sie möchten, können Sie auch mit der Iterator-Instanz darüber iterieren:
Die foreach-Dokumentation befindet sich unter http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html . Eine vollständigere Implementierung finden Sie in meinem persönlichen Google-Code .
Um die Auswirkungen dessen zu erhalten, was Sie benötigen, müssen Sie meines Erachtens ein Filterkonzept in den Iterator einfügen ... Da der Iterator von den nächsten Werten abhängt, ist es schwierig, true auf hasNext () und dann zurückzugeben Filtern Sie die next () - Implementierung mit einem Wert, der beispielsweise nicht mit einem Zeichen "a" beginnt. Ich denke, Sie müssen mit einem sekundären Interator herumspielen, der auf einer gefilterten Liste mit den Werten mit dem angegebenen Filter basiert.
quelle
for instance
Ist das ein Wortspiel?Gutes Beispiel für Iterable zur Berechnung der Fakultät
Funktionscode für Java 1.8
Benutzerdefinierte iterierbare Klasse
Benutzerdefinierte Iterator-Klasse
quelle
Dies ist der vollständige Code zum Schreiben eines Iterators, sodass er über Elemente iteriert, die mit 'a' beginnen:
Benutzerdefinierte Iterator-Klasse
quelle
Sie können Ihren eigenen Iterator implementieren. Ihr Iterator kann so konstruiert sein, dass er den von der Liste zurückgegebenen Iterator umschließt, oder Sie können einen Cursor behalten und die Methode get (int index) der Liste verwenden. Sie müssen nur der nächsten Methode Ihres Iterators UND der hasNext-Methode Logik hinzufügen, um Ihre Filterkriterien zu berücksichtigen. Sie müssen auch entscheiden, ob Ihr Iterator den Entfernungsvorgang unterstützt.
quelle
Hier ist die vollständige Antwort auf die Frage.
ListIterator
ist der Iterator für das Array, der die Elemente zurückgibt, die mit 'a' beginnen.NoSuchElementException
Ausnahme zurückgegeben.quelle