2016-04-10 12 views
1

Ich frage mich, ob das möglich ist, und wenn ja, wie kann ich das tun? Grundsätzlich, was ich sah, und denke, ist das Problem, dass der Cursor des Iterators bewegt wird, wenn ich add Funktion verwende (ich verstehe Iteration nicht perfekt, so weiß ich nicht, ob das Problem ist). Das Problem passiert, wenn ich ein Element entfernen und dann hinzufügen zwei weitere (das ist der spezifische Fall, in dem ich ein Problem gefunden habe).Liste ändern, während ich darüber iteriere und über neue Elemente iteriere

Mein Code ist so etwas wie dieses:

List<String> list =new ArrayList<>(); 
for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();) 
     //here i am adding and removing elements 
+0

Ist das Java? Es hilft, wenn Sie den Leuten sagen, welche Sprache Sie verwenden. Sie unterscheiden sich. –

+0

Wie auch immer, die Antwort ist nein, Sie können nicht, und Sie müssen nicht. Iterate über eine Kopie. Keine Ahnung, wie Sie das in Java machen, aber ich bin mir ziemlich sicher, dass Sie hier auf SO ein Dutzend Beispiele finden werden. –

+0

Sorry, ich habe vergessen zu schreiben, dass es Java ist, trotzdem vielen Dank für die Antwort, aber ich kann das nicht tun, da die Bedingungen zum Hinzufügen von Elementen von Elementen abhängen, die ich zuvor hinzugefügt habe. – user18497

Antwort

0

ListIterator Nach JLS

Ein Iterator für Listen, die der Programmierer ermöglicht die Liste in jeder Richtung zu durchqueren, ändern Sie die Liste während Iteration, und erhalte die aktuelle Position des Iteratorsin der Liste. Ein ListIterator hat kein aktuelles Element; seine Cursorposition liegt immer zwischen dem Element, das durch einen Aufruf von previous() zurückgegeben wird, und dem Element, das durch einen Aufruf von next() zurückgegeben werden würde. Ein Iterator für eine Liste der Länge n hat n + 1 möglichen Positionen Cursor, wie sie durch die Carets dargestellt (^) unten:

enter image description here

Sie können die Add() verwenden, entfernen() Methode, um die Änderung in Iterator und die gleiche wird in der Listenreferenz wiedergegeben.


Remove gemäß JLS

Entfernt aus der Liste das letzte Element, das durch next() oder vorherigen() (optional Betrieb) zurückgegeben wurde. Dieser Anruf kann nur einmal pro Anruf zum nächsten oder vorherigen erfolgen. Es kann nur gemacht werden, wenn add (E) nicht nach dem letzten Aufruf zum nächsten oder vorherigen aufgerufen wurde.

Also, wenn Sie entfernen verwenden zweimal ohne nächsten Aufruf() oder vorherigen() wird es java.lang.IllegalStateException werfen
ich modifizierte Code hinzufügen zu testen() und entfernen()

public static void main(String[] args) { 

    List<String> list =new ArrayList<>(); 
    list.add("55"); 
    list.add("155"); 
    list.add("255"); 
    for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext();){ 

     System.out.println(list.size()); 
     iterator.add("88"); 
     System.out.println(list.size()); 
     iterator.next(); 
     System.out.println(list.size()); 
     iterator.remove(); 
     System.out.println("first remove done"); 
     iterator.remove(); // will throw exception if previous or next is not called 
    } 

    System.out.println(list); 
}