# elemente aus einer Collection korrekt löschen



## 0x7F800000 (23. Sep 2008)

Entschuldigt die blöde Frage: die Forumsuche hat nicht viel ergeben, und google findet irgendwelche Vorschläge, die mir nicht besonders vertrauenswürdig erscheinen :roll: 

Angenommen, ich will aus einer Collection alle Elemente löschen, die eine bestimmte Bedingung erfüllen. Könnte mir jemand sagen, ob es eine "schönere" Methode gibt, als die Collection durchzuiterieren, alle Elemente in einer separaten Liste zu speichern, und anschließend per removeAll(Collection) diese Elemente zu entfernen?

Bisher habe ich das irgendwie so gemacht:

```
import java.util.*;

class TEST{
   public static void main(String args[])throws Exception
   {
	   LinkedList<Integer> list=new LinkedList<Integer>();
	   
	   list.add(Integer.valueOf(2));
	   list.add(Integer.valueOf(1));
	   list.add(Integer.valueOf(2));
	   list.add(Integer.valueOf(3));
	   list.add(Integer.valueOf(2));
	   
           //die 2 soll entfernt werden
	   List<Integer> trash=new LinkedList<Integer>();
	   for(Iterator<Integer> i=list.iterator(); i.hasNext(); ){
		   Integer n=i.next();
		   if(n.equals(Integer.valueOf(2))) trash.add(n);
	   }
	   list.removeAll(trash);
	   
	   System.out.println(list);
   }
}
```
weil ansonsten bei all meinen Versuchen irgendwann eine ConcurrentModificationException geflogen ist (Element entfernt => Iterator ungültig)

Es gibt doch bestimmt eine schönere Möglichkeit, nur dummerweise fällt mir diese gerade nicht ein. Wäre sehr dankbar wenn mir jemand einen Tipp geben könnte.

greetz, Andrey.


----------



## diggaa1984 (23. Sep 2008)

wenn du eh manuell durchrennst um zu suchen, kannst doch gleich das remove des Iterators nutzen


----------



## 0x7F800000 (23. Sep 2008)

Aua, peinlich sowas^^  die lösung war natürlich einen Punkt entfernt^^ ein wenig schlaf wär wohl nicht schlecht für bessere konzentration... :autsch:

danke sehr!


----------



## Landei (23. Sep 2008)

Wenn man eine Liste (am besten ArrayList, LinkedList wäre da natürlich schlecht) hat, kann man natürlich auch "indiziert" an die Sache herangehen. Dabei hat sich bewährt, von hinten anzufangen, damit man keine Probleme mit dem "Nachrutschen" bekommt:

```
for (int i = list.size() - 1; i >= 0; i--) {
    if (list.get(i) == 2) {
        list.remove(i)
    }
}
```

Nebenbei, das ganze Integer.valueOf kannst du dir seit Java 1.5 sparen, du kannst die ints auch so übergeben (Autoboxing/-unboxing).


----------



## Marco13 (23. Sep 2008)

Bei einer List<Integer> gibt's mit Autoboxing/Autounboxing aber einen kleinen Stolperstein:

```
import java.util.*;

class IntegerListTest
{
    public static void main(String args[])
    {
        List<Integer> a = new ArrayList<Integer>(Arrays.asList(1,2,3));
        List<Integer> b = new ArrayList<Integer>(Arrays.asList(1,2,3));

        a.remove(1);
        System.out.println(a); // Ausgabe: [1, 3]

        b.remove(Integer.valueOf(1));
        System.out.println(b); // Ausgabe: [2, 3]
    }
}
```
Man sollte immer GENAU aufpassen, ob man das Element oder den Index meint....


----------



## Landei (23. Sep 2008)

Ja, ich weiß. Hab's aber oben richtig gemacht :-D


----------



## SlaterB (23. Sep 2008)

```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        List<Integer> list = new ArrayList<Integer>();
        Collections.addAll(list,2,3,2,4,2);

        System.out.println(list);

        Integer toRemove = Integer.valueOf(2);
        while (list.remove(toRemove));

        System.out.println(list);
    }
}
```


----------



## Leroy42 (23. Sep 2008)

Marco13 hat gesagt.:
			
		

> Bei einer List<Integer> gibt's mit Autoboxing/Autounboxing aber einen kleinen Stolperstein:
> 
> ```
> ...
> ```



Ohh!  :shock: 

Gut zu wissen!


----------



## 0x7F800000 (23. Sep 2008)

Integer sind hier nur als Beispiel verwendet worden, aber in der tat: gut zu wissen


----------

