Java aus Liste während der Iteration Listenelemente löschen

Posted: Januar 21st, 2011 | Filed under: Programmieren | Tags: , , , , , , , , | 7 Comments »

Oft kommt es vor dass man in Java während der Iteration über eine ArrayList oder eine LinkedList ein Element nach einem gewissen Kriterium heraus löschen will. Über die gewöhnliche Schleife for(String name : namen) geht dies jedoch nur über Umwege mit einer zweiten Hilfsliste. Löscht man Elemente während der Iteration mit obiger Schleife erhält man eine java.util.ConcurrentModificationException.

Folgende Lösung ist weitaus einfacher und effizienter. Hier wird nämlich ein Iterator verwendet und es ist möglich während der Iteration zu löschen:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListRemoveDuringIteration {

  public static void main(String[] args) {
    List<String> namen = new ArrayList<String>();
   
    namen.add("Peter");
    namen.add("Paul");
    namen.add("Maria");
    namen.add("Frank");
   
    for (Iterator<String> nameIter = namen.iterator(); nameIter.hasNext();){
      String name = nameIter.next();
      if(name.equals("Paul")){
        nameIter.remove();
        System.out.println("Paul wurde während der Iteration aus der Liste gelöscht!");
      }
    }
  }
}

 

Quelltextdatei herunterladen: ListRemoveDuringITeration.java


7 Comments on “Java aus Liste während der Iteration Listenelemente löschen”

  1. 1 Leser dieses Beitrags said at 13:37 on November 29th, 2012:

    Vielen Dank. Bin gerade auf diesen Eintrag über Google gekommen und er hat mir sehr weitergeholfen.

    Habe vorher (angelehnt an dein Beispiel):
    namen.remove(name);

    und hab dann in einigen Fällen eine Exception gekriegt.
    Mit deinem Vorschlag funktionierts jetzt. Danke 🙂

  2. 2 pablokrutzi said at 12:09 on März 13th, 2014:

    Wenn der letzte Name in der Liste Paul ist, wird der übergangen oder? Denn für das letzte Element in der Liste gilt hasNext() = false, oder?

  3. 3 admin said at 20:50 on März 13th, 2014:

    Hi Pablo,

    nein Paul wird nicht „übergangen“, zu dem Zeitpunk bist du ja noch beim Vorletzten. Paul wird danach als aktueller gesetzt. Erst dann stimmt die Schleifenbedingung nicht mehr…

  4. 4 TimBOne said at 17:21 on Juni 22nd, 2015:

    Hey,

    ich versuche Elemente aus einer Map zu löschen, aber es will nicht so ganz funktionieren 🙁

    Hat jmd eine Ahnung was falsch ist.

    Map<String, String> recipes = *Map zum removen*;

    for(Iterator iterator = *Map*.entrySet().iterator(); iterator.hasNext();) {

    Entry<String, String> entry = iterator.next();

    if(name.equals(entry.getKey())) {

    iterator.remove();
    }
    }

    Bitte helft mir 🙂

  5. 5 Verzweifelt said at 12:47 on November 8th, 2015:

    ich kann nicht it.remove(); nutzen, woran kann das liegen ?

    mein code:

    public static void zimmerLöschen() {

    Scanner sc = new Scanner(System.in);

    for(Zimmer löschen : listeZimmer){

    System.out.println("Welches Zimmer möchten Sie löschen?");
    // try {
    String deletBuchstabe = sc.nextLine();
    int delet = Integer.parseInt(deletBuchstabe);

    if (löschen.getZimmerNummer()== delet){

    it.remove();

    }
    }
    }

  6. 6 Katakis said at 14:56 on Dezember 11th, 2015:

    Hallo Verzweifelt,

    die ForEach-Schleife ( : ) lässt leider keinen direkten Zugriff auf den Iterator zu. Du kannst aber
    //for (Zimmer löschen : listeZimmer) {
    durch
    for (Iterator it = listeZimmer.iterator(); it.hasNext();) {
    ersetzen. Jetzt steht dir der Iterator it zur Verfügung.

    Innerhalb der Schleife musst du noch folgendes einfügen
    Zimmer löschen = it.next();
    , damit du vom dem Iterator das Zimmer bekommst.

  7. 7 Katakis said at 15:01 on Dezember 11th, 2015:

    Noch eine Anmerkung an Verzweifelt:
    Die Abfrage, welches Zimmer gelöscht werden soll, sollte nicht unbedingt in den Iterator. Denn dann kann man in jeder Iteration immer nur das aktuelle Zimmer löschen.


Leave a Reply