Java-Iteratoren und for-each-loop. Wie kann ich auf den zugrunde liegenden Iterator zugreifen?

7

Ich mag die for-each-loop-Konstruktion ( for(T e : iterable) ) in Java, die auf jedem Iterable<T> funktioniert, weil es in vielen Fällen sehr einfach zu lesen und zu schreiben ist.

Ich frage mich jedoch, ob es irgendeinen Weg gibt, wie ich von einer solchen Schleife auf den zugrunde liegenden Iterator zugreifen kann. Dies kann obligatorisch sein, wenn ich remove() vom Iterator verwenden möchte.

    
Albert 15.10.2010, 12:08
quelle

6 Antworten

17

Nein, der ganze Punkt der for-each-Schleife besteht darin, den zugrundeliegenden Iterator wegzuspulen.

Wenn Sie es brauchen, müssen Sie es deklarieren.

    
sleske 15.10.2010, 12:10
quelle
4

Nein, Sie können keine Objekte in einer Schleife für jede Schleife entfernen.

Verwenden Sie stattdessen:

%Vor%     
Roman 15.10.2010 12:11
quelle
1

Verwenden Sie stattdessen eine for-Schleife.

    
Tyler Treat 15.10.2010 12:11
quelle
1

Wenn die Sammlung relativ klein ist, können Sie alternativ eine Kopie der Sammlung zum Iterieren verwenden, wenn Sie Elemente entfernen möchten, so dass Sie sich nicht wie zwei Sammlungen verhalten müssen.

%Vor%

Noch besser: Apache CollectionUtils (und es gibt wahrscheinlich eine Google-Alternative und eine Generika-Alternative) bietet filter(java.util.Collection collection, Predicate predicate) . In diesem Beispiel wird die gesamte Liste zurückgegeben. Sie können ein Prädikat zur Wiederverwendung speichern.

%Vor%     
Peter DeWeese 15.10.2010 12:35
quelle
1

Sie haben Recht, wenn ein Iterator die Möglichkeit zum sicheren Entfernen eines Objekts aus einer Quellensammlung unterstützt, indem Sie remove () auf dem Iterator selbst aufrufen. Der Punkt hier ist, eine ConcurrentModifiedException zu vermeiden, die impliziert, dass eine Auflistung geändert wurde, während ein Iterator dagegen geöffnet war. Bei einigen Sammlungen können Sie Elemente entfernen oder Elemente hinzufügen, während Sie darüber hinweg iterieren, aber das Aufrufen von remove () auf dem Iterator ist sicherer.

Aber Iterator unterstützt einen abgeleiteten und leistungsstärkeren Cousin ListIterator , der nur in Listen verfügbar ist. Er unterstützt sowohl das Hinzufügen als auch das Entfernen aus einer Liste während der Iteration sowie das bidirektionale Scrollen durch Listen.

    
Shawn Vader 15.10.2010 12:42
quelle
0

das Ändern von Daten hat ein falsch Gefühl. Erstellen Sie einfach ein neues Iterable (oder eine Sammlung) und fügen Sie die Elemente hinzu, die Sie behalten möchten. Die anderen Zeiten gehen in der for Schleife verloren (( irgendwie **

    
quelle

Tags und Links