First Search: 4 Second Search: -1
Iterator
Oft möchten wir auf die Elemente einer ArrayList
einzeln und der Reihe nach zugreifen. Wir könnten eine Zählschleife schreiben. Oder wir könnten ein Iterator
-Objekt verwenden. Um ein Iterator
-Objekt zu erhalten, verwenden wir diese Methode von ArrayList
:
Iterator<E> iterator() // gibt einen Iterator
zurück
ArrayList
implementiert die Schnittstelle Iterable
. Die einzige Methode in dieser Schnittstelle ist iterator()
.
Ein Iterator
-Objekt wird verwendet, um auf die Elemente einer Liste nacheinander aufzusuchen. Dabei werden nur die Zellen besucht, die Daten enthalten (so dass man sich keine Gedanken darüber machen muss, dass man das Ende der Daten überschreitet). Dies ist praktischer als eine Schleife zu schreiben. Ein Iterator
-Objekt implementiert die Schnittstelle Iterator<E>
, die die folgenden Methoden hat:
boolean hasNext() // Liefert true, wenn noch nicht alle Elemente besucht wurden. E next() // Liefert das nächste Element der Liste, // einen Verweis auf den Typ E void remove() / Entfernt das gerade von next() zurückgegebene Element aus der Liste
Hier ist ein Programm, das jedes Element in der ArrayList
ausgibt:
import java.util.* ; public class IteratorExample { public static void main ( String[] args) { // Liste erzeugen und füllen ArrayList<String> names = new ArrayList<>(); names.add( "Amy" ); names.add( "Bob" ); names.add( "Chris" ); names.add( "Deb" ); names.add( "Elaine" ); names.add( "Frank" ); names.add( "Gail" ); names.add( "Hal" ); // Einen Iterator für die Liste erzeugen Iterator<String> iter = names.iterator(); // Den Iterator verwenden while ( iter.hasNext() ) System.out.println( iter.next() ); } }
Mehrere Klassen in den Java-Bibliotheken implementieren die Schnittstelle Iterator<E>
. Einige dieser Klassen sind kompliziert, und eine einfache Schleife kann nicht verwendet werden, um auf alle ihre Elemente zuzugreifen. Für diese Klassen ist ein Iterator
, der systematisch auf jedes Element zugreift, sehr nützlich.
Verwechslungsgefahr: Achtet auf die ZWEI Schnittstellen:
Iterable
-Schnittstelle — eine Klasse, die diese implementiert, kann für sich selbst ein Iterator
-Objekt erstellen.Iterator<E>
-Schnittstelle — ein Iterator
-Objekt implementiert Methoden, um die Elemente einer Liste zu besuchen.Ein Programm enthält z.B. den folgenden Code:
ArrayList<Integer> primes = new ArrayList<Integer>();
Angenommen, die Liste wurde mit Elementen gefüllt. Wir füllen die Lücken aus, um einen Iterator für die Liste zu erstellen: