Doppel-Iterator-Schleife
So habe ich diese Schleife in meinem code muss zwei getrennt arbeitenden und separat Iteratoren. Jedoch, wenn versucht wird, rbIterator.next(), java wirft eine ConcurrentModificationException. Wie kann ich es stoppen, dass aus geschieht?
Dank
Iterator<Road> raIterator = roads.listIterator(0); //I also tried .iterator(), with no avail
while(raIterator.hasNext()){
Road ra = raIterator.next();
Iterator<Road> rbIterator = roads.listIterator(0);
while(rbIterator.hasNext()){
Road rb = rbIterator.next();
//snipped code that adds a road to the list
roads.add(xyz);
}
}
InformationsquelleAutor wolfd | 2011-08-10
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie keine Elemente hinzufügen, um die meisten standard-Implementierungen von
List
während der Iteration über Sie, es sei denn, Sie legen eine Implementierung, die es erlaubt die!ArrayList
jedoch nicht sehen javadoc. Noch haben die meisten* (vielleicht alle) der Java Collections FrameworksList
Implementierungen.Eine Lösung wäre, eine neue Liste erstellen,
temp
vor zu iterieren, hinzufügen von Elementen zutemp
während Sie Durchlaufen, und fügen Sie alle Elemente intemp
zum ersten.Edit: verwendet
addAll(temp)
Dank @Michael OsterWenn Sie eine
ListIterator<E>
statt, Sie werden in der Lage sein, um hinzuzufügen. Der Grund dafür, dass Sie immer die Ausnahme ist b/c von dieser(aus den javadocs):Können Sie nicht ändern die Liste selbst direkt, sondern über den iterator, können Sie. Die Basis
Iterator<E>
- Klasse verfügt nicht über eine add-Methode, aberListIterator<E>
macht, ist, was Sie bekommen, wenn Sie rufen Sie dieobj.listIterator()
anywqay.Habe ich erlebt dieses problem vor. Es ist, weil Sie versuchen, zu Durchlaufen die gleiche Sache (Straßen) zweimal. Dies ist gefährlich, denn wenn ein iterator ändert, die Straßen, dann die anderen iterator ist geworfen in eine unbekannte/unzuverlässigen Staat.
Wenn könnten Sie verwalten, um eine for-Schleife verwenden, die dieses problem lösen würde, da es scheint, gerecht zu werden. Das würde davon abhängen, die Art der Straßen (die Sie nicht aufgenommen haben) obwohl.
Können Sie nicht mit einem Iterator. Sie können jedoch mit direktem Zugang über die Liste der get() Methode.
Dieser code tut, was Sie wollen (und kompiliert und läuft OK):
roads.size()
bevor Sie beginnen die erste Schleife und verwenden Sie es für die innere Schleife die Einschränkung.