Frage Erstellen benutzerdefinierter Iterator-Java?


Ich bin ein wenig verwirrt darüber, wie man einen benutzerdefinierten Iterator für eine Klasse in Java implementiert. Ich muss im Wesentlichen eine ArrayList erstellen, ohne die eingebauten Bibliotheken zu verwenden, die mir bereits zur Verfügung stehen. Ich verstehe die Grundlagen der Erstellung der Klasse, aber ich habe Probleme zu verstehen, wie man den Iterator dazu bringt, in all dies zu passen. Ich habe folgendes:

Ich habe eine generische Klasse erstellt, die die iterierbare Schnittstelle so implementiert, dass sie ungefähr so ​​aussieht:

public class MyArrayList<T> implements Iterable<T> {

Ich muss dann eine Klasse namens MyIterator erstellen, die gemäß dem Wortlaut des Dokuments eine eigenständige Klasse ist. Das scheint ziemlich einfach zu sein. Ich mache eine neue Klasse namens MyIterator und lasse sie die Iterator-Schnittstelle so implementieren, dass sie ungefähr so ​​aussieht:

public class MyIterator<T> implements Iterator<T>{

Meine Verwirrung liegt im Folgenden. Das Dokument besagt, dass der Iterator in seiner eigenen Klasse sein muss, aber wie kann ich dann auf die Datenelemente in "MyArrayList" zugreifen, um beispielsweise hasNext () und next () vollständig zu implementieren. Da die Datenelemente im zugrunde liegenden Array privat sind (wie sie sein sollten), sehe ich nicht, wie eine externe Klasse diese Methoden vollständig implementieren kann. Missverstehe ich, was erforderlich ist? Durch separate Klasse ist es immer noch ein Teil der "MyArrayList" -Klasse aber anders definiert?

Ich hoffe, das hilft, wie ich sagte, ich denke, ich verstehe, was von mir verlangt wird, ich weiß nicht genau, wo mein Iterator in all das passt.


5
2017-09-04 09:21


Ursprung


Antworten:


Während der Iterator eine separate Klasse sein muss *, diese Klasse wird wahrscheinlich eine Beziehung zu dir haben Iterable Klasse.

Es ist oft eine verschachtelte / innere Klasse, gerade weil es auf die Werte der Klasse zugreifen muss (und genau dafür sind die inneren Klassen geschaffen).

Zugegeben, wenn die Iterable ist ein List du könntest ein implementieren Iterator ohne irgendeinen "internen" Zugang, aber Sie wollen immer noch Zugang zu den Interna für Dinge wie das Überprüfen des modCount (um eine zu werfen ConcurrentModificationException wenn das Iterable ist strukturell verändert, während Sie darüber iterieren ... und zu verhindern diese Ausnahme, wenn Sie sie über die ändern Iterator selbst).

* Sie könnte Implementiere es mit deinem Iterable Instanz selbst, aber das würde den Vertrag brechen, sobald der Benutzer zwei Iteratoren gleichzeitig verwendet.


6
2017-09-04 09:30



Sie müssen Ihre eigenen Methoden deklarieren hasNext(), next(), remove(). Es muss wissen, wie man über seine eigene Klasse iteriert, wie man zum nächsten Element geht und prüft, ob das nächste Element existiert.


1
2017-09-04 09:26