PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ArrayList in einer Schleife durchgehen und ein Element hinzufügen



Hobbes
28-11-2008, 15:50
Hi allerseits,

ich habe ein Problem mit einer ArrayList in Java. Diese ArrayList ist mit Werten gefüllt, die ich in einer for-Schleife durchgehe. Wenn in der Schleife eine bestimmte Bedingung erfüllt ist, soll am Ende der ArrayList ein neues Element hinzugefügt werden, das später natürlich auch in der Schleife abgearbeitet werden soll.

Gibt es eine Möglichkeit, das zu realisieren?

Lang Rede, kurzer Sinn: hier mal ein kleines Beispiel:


import java.util.ArrayList;

public class MinimalClass {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList();
al.add(1);
al.add(2);
al.add(3);
for (int i : al) {
System.out.println(i);
if (i == 2) {
al.add(4);
}
}
}
}


Das Hinzufügen funktioniert aber nicht. Es kommt folgende Exception:


Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification( AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java: 420)
at MinimalClass.main(MinimalClass.java:9)

[b]EDIT[b]
Problem gelöst

Hier die Lösung:


import java.util.*;

public class MinimalClass {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList();
al.add(1);
al.add(2);
al.add(3);
int iAnz = al.size();
for (int i=0; i<iAnz; i++) {
int iOut = al.get(i);
System.out.println(iOut);
if (iOut == 2) {
al.add(4);
iAnz++;
}
}
}
}

Beatkiller
25-12-2008, 15:01
Das würde ich so nicht machen. Man manipuliert nicht die Anzahl der Elemente einer Liste, die man mittels for-Schleife durchläuft. Ich würde eine Kopie der List erzeugen, die Kopie durchlaufen, und bei entsprechender Erfüllung der Bedingung das Original ändern. Die Methode clone() sollte dabei hilfreich sein.

Grüße

BlueJay
26-12-2008, 09:13
Man manipuliert nicht die Anzahl der Elemente einer Liste, die man mittels for-Schleife durchläuft.

Das rührt daher, dass es Compiler gibt (z.B. Oxford-Pascal), die einmal, wenn die Schleifenbedingung bekannt ist, zum Verrecken nicht den Endwert geschweige denn die Schrittweite ändern lassen.

Wenn Hobbes seine Lösung so verfeinert, dass die Schleifenparameter in Ruhe gelassen werden, passiert kein Unglück, und es kommt etwa so was dabei raus, gleichzeitig ein Beispiel für die ach, so überflüssigen do-while-Schleifen! :D



int i,k;
bool geadded;
int listenstart=0; // ... damit man nicht immer von vorne anfangen muss
int listenende=liste.length; // ... damit Änderungen der Listenlänge die Schleifenbedingungen nicht versauen
do
{
geadded=false;
for (i=listenstart; i<listenende; i++)
{
k=dingsbums(liste[i]); // k>0? Element anhängen
if (k>0) add_liste(k,liste); // fügt Element k am Ende der Liste liste ein
}
if (liste.length>listenende) // es ist was hinzugekommen, also neue Elemente checken!
{
geadded=true;
listenstart=listenende; // bis listenende-1 war schon gecheckt
listenende=liste.length; // neue Listenlänge
}
}
while (geadded);



so long,
Blue Jay

peschmae
28-12-2008, 06:11
Das würde ich so nicht machen. Man manipuliert nicht die Anzahl der Elemente einer Liste, die man mittels for-Schleife durchläuft. Ich würde eine Kopie der List erzeugen, die Kopie durchlaufen, und bei entsprechender Erfüllung der Bedingung das Original ändern. Die Methode clone() sollte dabei hilfreich sein.


Das tönt jetzt dann doch etwas gar kompliziert. Was sollte der Vorteil sein von so einem Vorgehen? Abgesehen davon dass es mehr speicher braucht, was ein nicht zu verachtender Vorteil ist ;-). Insbesondere wenn man die neu hinzugefügten Elemente nachher auch noch durchlaufen will.

Dass man ihn steinigen sollte würde er mitten in der ArrayList Elemente einfügen, da bin ich auch dafür. Tut er aber nicht (ich schon diese Tage, wobei manchmal kopier ich den Krams auch erst schnell in eine LinkedList...). Also tue ich auch nicht. :)

MfG Peschmä, der do-while schleifen nicht mag, genauso wenig wie Pascal, Kobold und Smalltalk