# for each schleife und löschen von elementen



## Lirave (19. Jan 2010)

Hallo, ich bin auf ein weiteres Problem gestoßen.

Ich habe eine gefüllte Liste 
     LinkedList<Stein> Liste1
und ein Object Stein 
     s1

Nun möchte ich in einer Schleife jedes Object der LinkedList durchgehen und sollte ein object exisitieren, dass wie s1 ist, dann soll es aus der Liste gelöscht werden.

mit 

```
for(Stein s2 : Liste1){
     if equals(s1,s2) {
         Liste1.remove(s2)
     }
}
```

klappt es nicht, da er dann nach dem ersten entfernen nicht weiß wie die schleife weiter zu laufen hat.

Wie stellt man das richtig an ?

Mit freundlichen Grüßen
Robert


----------



## faetzminator (19. Jan 2010)

Funktioniert bei mir ohne Probleme:

```
ArrayList<String> items = new ArrayList<String>();
items.addAll(Arrays.asList(new String[] {"foo", "bar", "baz"}));
for (String item : items) {
    if ("bar".equals(item)) {
        items.remove(item);
    }
}
```
Was ich allerdings komisch finde, dass bei folgendem Code eine [c]java.lang.UnsupportedOperationException[/c] geworfen wird:

```
List<String> items = Arrays.asList(new String[] {"foo", "bar", "baz"});
for (String item : items) {
    if ("bar".equals(item)) {
        items.remove(item);
    }
}
```


----------



## Marco13 (19. Jan 2010)

Was bei Arrays.asList zurückgegeben wird, ist eine "Listige" _Ansicht_ auf den darunter liegenden Array. Und Arrays kann man nicht verändern.


----------



## SlaterB (19. Jan 2010)

```
ArrayList<String> items = new ArrayList<String>();
        items.addAll(Arrays.asList(new String[]  {"foo", "bar", "baz", "baz"}));
        for (String item : items)
        {
            if ("bar".equals(item))
            {
                items.remove(item);
            }
        }
```
führt auch zu einer Exception,

ein Iterator kann nicht richtig arbeiten wenn man zwischendurch die Liste ändert,
sammel die zu löschenden Daten in einer zweiten Liste und entferne sie zum Schluss


----------



## Lirave (19. Jan 2010)

bei mir wirft er folgendes Exception

java.util.ConcurrentModificationException

hier nochmal mein derzeitiger Code wobei Steine eine LinkedList<Stein> ist die 10 objecte enthält

```
Stein s1 = Steine.get(2);
	        for(Stein s2 : Steine){
	            if (Funktionen.equal(s1,s2)) {
	                Steine.remove(s2);
	            }
	       }
```


edit: ok dann werde ich eine neue liste erstellen müssen


----------



## faetzminator (19. Jan 2010)

@SlaterB:
Da hast du recht, habs natürlich nur mit 3 Elementen getestet :noe:
@Lirave:
Da musst du es mit der "alten" for-Schleife machen:

```
ArrayList<String> items = new ArrayList<String>();
items.addAll(Arrays.asList(new String[] {"foo", "bar", "baz", "baz"}));
for (int i = 0; i < items.size(); i++) {
    if ("bar".equals(items.get(i))) {
        items.remove(i--);
    }
}
```

Edit: Was für ein "schöner" Programmierstil verbirgt sich denn hinter [c]Funktionen.equal(s1,s2)[/c] :autsch: ?


----------



## SlaterB (19. Jan 2010)

faetzminator hat gesagt.:


> Edit: Was für ein "schöner" Programmierstil verbirgt sich denn hinter [c]Funktionen.equal(s1,s2)[/c] :autsch: ?


hier ist noch was zu tun:
http://www.java-forum.org/java-basics-anfaenger-themen/94861-heap-space-linkedlist-umspeichern.html


----------



## faetzminator (19. Jan 2010)

SlaterB hat gesagt.:


> hier ist noch was zu tun:
> http://www.java-forum.org/java-basics-anfaenger-themen/94861-heap-space-linkedlist-umspeichern.html



Tschuldigung, aber ich sollte ab und zu noch arbeiten...


----------



## Bartleby (19. Jan 2010)

Das ganze funktioniert auch mit dem Umweg über den Iterator:


```
ArrayList<String> items = new ArrayList<String>();
    items.addAll(Arrays.asList(new String[] {"foo", "bar", "baz", "baz"}));
    Iterator<String> iterator = items.iterator();
    while(iterator.hasNext()) {
      String next = iterator.next();
      if ("bar".equals(next)){
          iterator.remove();
      }
    }
```


----------

