Durchschleifen einer ArrayList und dabei einzelne Listeneinträge löschen

  • Hey zusammen,

    ich mache grade etwas mit einer ArrayList und bin dabei auf einen Fehler gestoßen, den ich herleiten konnte:

    Sobald ich in der Schleife einen Wert entferne, hört die Schleife einfach auf. Egal, ob an 1. Stelle oder sonst wo. Ich würde gerne mehrere Werte aus einer ArrayList anhand von bestimmten Kriterien entfernen. Ich möchte es dafür nicht in ein Array umwandeln. Gibt es da irgendeine einfache Möglichkeit?

    "Workaround" in meinem Kopf wäre ein Hilfsarray mit den Werten, die raus sollen und danach dann einfach das Array durchschleifen mit .Remove auf der ArrayList. Aber kann mir nicht vorstellen, dass das der beste Weg ist?! :/ Dann habe ich ja auch wieder die "unschönen" ArrayAdd-Operationen ^^

  • Hatte zum Lernen einfach mal einige Arrays durch ArrayLists ersetzt (wegen deinem guten Beitrag: Alternativen zum Array ^^) und bislang war ich damit auch ganz happy. Notfalls muss ich refaktorieren, aber kann doch nicht sein, dass der Datentyp bei so etwas Grundsätzlichem dann schon an seine Grenze kommt? ^^'

    Müsste schon einige Stellen anfassen und mir angucken, wie die verschiedenen Operationen in Maps gehandhabt werden... :( Das würde ich lieber erstmal "einfach" Lösen und mir auf die ToDo-Liste schreiben, als es direkt zu machen :D

    2 Mal editiert, zuletzt von aSeCa (6. März 2024 um 15:25)

  • So geht es:

    Das Problem ist, dass ein For ... In ... intern einen Iterator nutzt. Während des durchlaufens der For-Schleife, darf das iterierte Objekt aber nicht verändert werden. (Wundert mich hier nur, dass es nicht mit einer Fehlermeldung beendet, sondern weiterläuft... AutoIt schluckt den Fehler wohl).
    Deshalb darfst du innerhalb der For ... In ... Schleife, das Objekt, über das iteriert wird nicht verändern (Hier $ObjList).

    Um das zu umgehen kannst du über den Index auf das Objekt zugreifen, wie ich in dem Beispiel gemacht habe. Dadurch, dass ich immer nur mit dem Index einzelne Objekte abfrage und lösche, kann ich die ArrayList währenddessen verändern.

    Nebenbei: Es ist in vielen Programmiersprachen so, dass man während der Nutzung eines Iterators das Objekt nicht verändern darf, da der Iterator dann probleme bekommt. Also einfach merken: Beim verändern; besonders beim Löschen; keine Schleife verwenden, die intern einen Iterator verwenden würde, sondern immer über den Index,... die einzelnen Zugriffe selbst verwalten.