# ArrayList - doppelte Einträge entfernen?



## 0001001 (21. Dez 2007)

Hallo,

habe hier eine ArrayList, die nur Strings enthält.
Also:

```
ArrayList<String> liste = new ArrayList<String>();
```

Jetzt würde ich gerne Strings, die doppelt vorkommen, entfernen. Nur wie?

Mit zwei for-Schleifen würde es funktionieren, aber das scheint mir doch etwas umständlich. Gehts auch einfacher?


----------



## The_S (21. Dez 2007)

doppelte gar nicht erst hinzufügen?


----------



## ARadauer (21. Dez 2007)

ich nehm da immer einen HashSet


----------



## 0001001 (21. Dez 2007)

@ Hobbit: Klar, aber das prüfen ob ein Eintrag schon vorhanden ist läuft dann auf das Gleiche hinaus wie nach doppelten zu suchen.

@ARadauer: HashSet wär ne Möglichkeit, allerdings kann ich meine Datenstrukturen jetzt nicht einfach so ändern.

Gibts keine Funktion die das effizient erledigt?


----------



## Marco13 (21. Dez 2007)

ArrayList<String> list = ...
LinkedHashSet<String> hashSet = new LinkedHashSet<String>(list);
list.removeAll();
list.addAdd(hashSet);

Hm.  :?


----------



## The_S (21. Dez 2007)

naja, aber du scheinst dich ja an den zwei schleifen zu stören ...


----------



## Guest (21. Dez 2007)

Mit einer Schlefe bist du zufrieden?  

```
Collections.sort(list);
String lastValue = null;
for(Iterator<String> i = list.iterator(); i.hasNext();) {
   String currentValue = i.next();
   if(lastValue != null && currentValue.equals(lastValue)) {
      i.remove();
   }
   lastValue = currentValue;
}
```


----------



## maki (21. Dez 2007)

> @ Hobbit: Klar, aber das prüfen ob ein Eintrag schon vorhanden ist läuft dann auf das Gleiche hinaus wie nach doppelten zu suchen.


Bin zwar nicht der Hobbit, aber auf die contains() Methode kann ich dich trotzdem aufmerksam machen 
Aber ein Set ist dafür wie geschaffen..


----------



## Wildcard (21. Dez 2007)

0001001 hat gesagt.:
			
		

> @ARadauer: HashSet wär ne Möglichkeit, allerdings kann ich meine Datenstrukturen jetzt nicht einfach so ändern.
> 
> Gibts keine Funktion die das effizient erledigt?


Wenn das grundsätzlich möglich ist, bedeutet es, dass du das List Interface nicht benötigst, das Collections Interface also genügen würde.
Damzufolge kannst du das Refactoring deiner IDE überlassen und den Typ auf Collection beschränken (das sollte man wo immer möglich tun, den Grund dafür kennst du ja jetzt).
Sobald das erledigt ist, schreibst du statt new ArrayList eben new HashSet und das war's.
Es hat schon seinen Grund warum es das Colelctions Interface und Iterator gibt  :wink:


----------



## Guest (28. Dez 2007)

Zwei Zeilen genügen:


```
ArrayList<String> liste = new ArrayList<String>();
// ...
Set<String> set = new LinkedHashSet<String>(liste);
liste = new ArrayList<String>(set);
```

Fred


----------

