Anzeige:
Ergebnis 1 bis 4 von 4

Thema: ArrayList in einer Schleife durchgehen und ein Element hinzufügen

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.12.2005
    Beiträge
    300

    ArrayList in einer Schleife durchgehen und ein Element hinzufügen

    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:

    Code:
    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:

    Code:
    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:

    Code:
    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++;
                }
            }
        }
    }
    Geändert von Hobbes (28-11-2008 um 17:14 Uhr) Grund: Problem gelöst

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2004
    Beiträge
    101
    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

  3. #3
    Registrierter Benutzer Avatar von BlueJay
    Registriert seit
    27.08.2004
    Beiträge
    825
    Zitat Zitat von Beatkiller Beitrag anzeigen
    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!

    Code:
    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
    Eigentlich ganz einfach, wenn man's weiss!

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von Beatkiller Beitrag anzeigen
    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
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •