Titel | Inhalt | Suchen | Index | API | Go To Java 2, Zweite Auflage, Handbuch der Java-Programmierung |
<< | < | > | >> | Kapitel 15 - Collections II |
Auf die Collections der Prä-1.2-JDKs konnte mit Hilfe des Enumeration-Interfaces und seiner beiden Methoden hasMoreElements und nextElement zugegriffen werden. Da Objekte, die dem Durchlaufen von Collections dienen, überall in der Informatik als Iteratoren bezeichnet werden, wurde die Namensgebung des Interfaces und seiner Methoden vielfach kritisiert. Die Designer der Collections der Version 1.2 haben sich nun dem allgemeinen Sprachgebrauch angepaßt und das Interface zum Durchlaufen der Elemente einer Collection als Iterator bezeichnet und mit folgenden Methoden ausgestattet:
boolean hasNext() Object next() void remove() |
java.util.Iterator |
hasNext gibt genau dann true zurück, wenn der Iterator mindestens ein weiteres Element enthält. next liefert das nächste Element bzw. löst eine Ausnahme des Typs NoSuchElementException aus, wenn es keine weiteren Elemente gibt. Wie beim Enumeration-Interface ist der Rückgabewert als Object deklariert und muß daher auf das passende Object gecastet werden. Als neues Feature (gegenüber einer Enumeration) bietet ein Iterator die Möglichkeit, die Collection während der Abfrage zu ändern, indem das zuletzt geholte Element mit der Methode remove gelöscht wird. Bei allen Collections, die das Interface Collection implementieren, kann ein Iterator zum Durchlaufen aller Elemente mit der Methode iterator beschafft werden.
Dies ist auch gleichzeitig die einzige erlaubte Möglichkeit, die Collection während der Verwendung eines Iterators zu ändern. Alle direkt ändernden Zugriffe auf die Collection machen das weitere Verhalten des Iterators undefiniert. |
|
Wir wollen uns die Benutzung eines Iterators an einem Beispiel ansehen:
001 /* Listing1502.java */ 002 003 import java.util.*; 004 005 public class Listing1502 006 { 007 public static void main(String[] args) 008 { 009 //Füllen der Liste 010 ArrayList list = new ArrayList(); 011 for (int i = 1; i <= 20; ++i) { 012 list.add("" + i); 013 } 014 //Löschen von Elementen über Iterator 015 Iterator it = list.iterator(); 016 while (it.hasNext()) { 017 String s = (String) it.next(); 018 if (s.startsWith("1")) { 019 it.remove(); 020 } 021 } 022 //Ausgeben der verbleibenden Elemente 023 it = list.iterator(); 024 while (it.hasNext()) { 025 System.out.println((String) it.next()); 026 } 027 } 028 } |
Listing1502.java |
Das Programm erzeugt zunächst eine Liste mit den Elementen "1",
"2", ..., "20". Anschließend wird durch Aufruf von iterator
ein Iterator über alle Elemente der Liste beschafft. Mit seiner
Hilfe werden alle Elemente der Liste durchlaufen und diejenigen, die
mit "1" anfangen, gelöscht. Der zweite Durchlauf durch die Liste
zeigt dann nur noch die übriggebliebenen Elemente an:
2
3
4
5
6
7
8
9
20
Neben dem Iterator-Interface gibt es das daraus abgeleitete Interface ListIterator. Es steht nur bei Collections des Typs List (und daraus abgeleiteten Klassen) zur Verfügung und bietet zusätzlich die Möglichkeit, die Liste in beiden Richtungen zu durchlaufen, auf den Index des nächsten oder vorigen Elements zuzugreifen, das aktuelle Element zu verändern und ein neues Element hinzuzufügen:
boolean hasPrevious() Object previous() int nextIndex() int previousIndex() void add(Object o) void set(Object o) |
java.util.ListIterator |
Mit hasPrevious kann bestimmt werden, ob es vor der aktuellen Position ein weiteres Element gibt; der Zugriff darauf würde mit previous erfolgen. Die Methoden nextIndex und previousIndex liefern den Index des nächsten bzw. vorigen Elements des Iterators. Wird previousIndex am Anfang des Iterators aufgerufen, ist sein Rückgabewert -1. Wird nextIndex am Ende aufgerufen, liefert es size() als Rückgabewert. Mit add kann ein neues Element an der Stelle in die Liste eingefügt werden, die unmittelbar vor dem nächsten Element des Iterators liegt. set erlaubt es, das durch den letzten Aufruf von next bzw. previous beschaffte Element zu ersetzen.
Ebenso wie beim Interface Collection sind die ändernden Methoden der Iteratoren optional. Falls ein Iterator eine dieser Methoden nicht zur Verfügung stellen will, löst er bei ihrem Aufruf eine Ausnahme des Typs UnsupportedOperationException aus. Das gilt für die Methoden add, set und remove. |
|
Titel | Inhalt | Suchen | Index | API | Go To Java 2, Zweite Auflage, Addison Wesley, Version 2.0 |
<< | < | > | >> | © 2000 Guido Krüger, http://www.gkrueger.com |