Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich würde gerne Elemente aus einer Collection löschen, während ich sie durchlaufe. Das führt natürlich dazu, dass der Iterator ins Leere greift und eine Exception wirft. Bleibt mir da keine andere Möglichkeit, als irgendwie ein bool-Array anzulegen und die Collection danach bearbeiten oder kann ich sie z.B. irgendwie rückwärts durchlaufen und immer das hinterste Element löschen?
Merk Dir doch die Objekte in einer anderen Collection/List.
Dann kannste danach du4rch diese iterieren und alles aus der ersten Collection löschen.
Sauberer ist natürlich wenn die Objekte in der Collection ein Attribut "removed" oder so hätten.
Aber das bekommst nachträglich natürlich nicht mehr rein, oder?
boolean ende;
do{
try{
for(Element e:collection)if(/*e soll entfernt werden*/)collection.remove(e);
ende=true;
}catch(/*Exception des Iterators nehm ich an? (ConcurrentModificationException*/){
ende=false;
}
}while(!ende)
Durchlaufe die while-schleife, wenn ein element entfernt wird sollte dein Iterator eine Exception werfen -> du durchläufst die while-schleife nochmal, ein neuer Iterator wird gebaut wo du dann wieder ein element rausnimmst.
Wenn der Iterator einmal durchkommt hat er kein Element mehr löschen müssen -> die while-schleife kann beendet werden.
Du musst die Collection auf die Java 1.4 Weise durchlaufen, also explizit einen Iterator anfordern und diesen fortbewegen.
Dann musst Du remove auf dem Iterator aufrufen, nicht auf der Collection. Hier ist ein Beispiel.
Java:
public static void removeOdd(Collection<Integer> collection)
{
Iterator<Integer> it = collection.iterator();
while (it.hasNext())
{
Integer i = it.next();
if ((i & 1) != 0)
{
it.remove(); // <--- wichtig!
}
}
}
Und ganz allgemein ausgedrückt (Element und shouldBeRemoved durch konkrete Dinge ersetzen):
Java:
public static void removeElements(Collection<Element> collection)
{
Iterator<Element> it = collection.iterator();
while (it.hasNext())
{
Element e = it.next();
if (shouldBeRemoved(e))
{
it.remove(); // <--- wichtig!
}
}
}
das gleiche Problem habe ich jetzt mit JLists. Ich möchste alle selektierten Elemente löschen und
Java:
for(index i : liste.getSelectedIndices())
((DefaultListModel)liste.getModel()).remove(i);
löscht sich die Elemente dann wieder selbst vor der Nase weg. Gibt es da eine andere saubere Möglichkeit oder muss ich das Array dann in ein Objekt umwandeln, dass man mit einem Iterator durchlaufen kann?
Diesmal muss ich aus einem eigenen DatenModell löschen, das intern eine HashMap verwaltet. Das Problem dabei ist, dass ich nicht iterator.remove aufrufen kann, sondern auf die eigene remove-Funktion ausweichen muss, weil da noch mehr gelöscht werden muss, als nur der Eintrag aus der HashMap.
Ich kann allerdings auch nicht die Technik des rückwärts Durchlaufens anwenden, weil ich eine Collection von DataEntrys zurückbekomme, die ich nicht in ein "manuell iterierbares" Format casten kann (oder ich bin zu doof dazu, kann natürlich auch sein )