# doppelte Einträge im String Array löschen



## Guest (12. Jun 2008)

Hallo,

könnt ihr mir sage wie ich am besten doppelte Einträge aus einem String-Array entferne. Gibt es dazu fertige Funktionen?


----------



## xysawq (12. Jun 2008)

ich kenne nix fertiges, aber ich poste mal wie ich es machen würde:


```
for(int i=0; i<(stringArray.length - 1); i++)
{
	for(int j=(i + 1); j<stringArray.length; j++)
	{
		if(stringArray[i] == stringArray[j])
		{
			String[] temp = new String[stringArray.length - 1];
			System.arraycopy(stringArray, 0, temp, 0, j);
			System.arraycopy(stringArray, j+1, temp, j, temp.length);
			stringArray = temp;
		}
	}
}
```


----------



## maki (12. Jun 2008)

Warum kein Set?

Ist fertig, einfach zu nutzen, etc.pp.

Collections sollten verwendet werden wo möglich Arrays sind doch viel zu low-level für die meisten Aufgaben.

xysawq, solltest dich auch langsam von arrays und arraycopy trennen


----------



## Guest (12. Jun 2008)

Du schreibst SET... welche denn? Eine TreeSet eine HashSet?


----------



## xysawq (12. Jun 2008)

Bin zu müde zum umdenken... mache grade ein Praktikum bei Siemens, und die machen das auch so rudimentär wie vor 20 Jahren... 

Wenn ich dann irgendwann meine 20 Präsentationen und meine Abschlusspräsentation vorm großen Chef, sowie meine 50 Seiten Fachbericht weg habe werde ich mich mal "weiterbilden"...


----------



## maki (12. Jun 2008)

Set ist ein Interface, HashSet ist ein Implementierung, TreeSet eine andere, die Doku erklärt die Unterschiede  dir reicht das HashSet.



			
				xysawq hat gesagt.:
			
		

> Bin zu müde zum umdenken... mache grade ein Praktikum bei Siemens, und die machen das auch so rudimentär wie vor 20 Jahren...
> 
> Wenn ich dann irgendwann meine 20 Präsentationen und meine Abschlusspräsentation vorm großen Chef, sowie meine 50 Seiten Fachbericht weg habe werde ich mich mal "weiterbilden"...


Mag ja sein, aber diese Array-akrobatik ist Schnee von Vorgestern.


----------



## SlaterB (12. Jun 2008)

> Eine TreeSet eine HashSet?

egal


----------



## Guest (12. Jun 2008)

Anonymous hat gesagt.:
			
		

> Hallo,
> 
> könnt ihr mir sage wie ich am besten doppelte Einträge aus einem String-Array entferne. Gibt es dazu fertige Funktionen?



Wie maki schon geschrieben hab bietet sich hier ein Set wunderbar an:


```
// sa ist hier dein besagtes String[] hab ja keine Ahnung wo das her kommt :)
Set<String> strings = new HashSet<String>();
for (int i = 0; i < sa.length; i++) {
    strings.add(sa[i]);
}
// Das Set enthält jetzt alle im String[] sa vorhandenen Strings und zwar jeden max. 1x
// Wenn du jetzt umbedingt wieder ein String[] haben willst kannst du auch einfach folgendes machen
sa = string.toArray(new String[0]);
```


----------



## Guest (12. Jun 2008)

Ist denn so ein SET auch einem Vector vorzuziehen. Bisher hab ich fast alles mit Vectoren gemacht.


----------



## Guest (12. Jun 2008)

Welchen Vorteil hat eigentlich diese Zeile:


```
Set<String> strings = new HashSet<String>();
```

gegenüber dieser:


```
HashSet<String> strings = new HashSet<String>();
```


----------



## FArt (12. Jun 2008)

Anonymous hat gesagt.:
			
		

> Ist denn so ein SET auch einem Vector vorzuziehen. Bisher hab ich fast alles mit Vectoren gemacht.



Ist was anderes. Vector ist synchronisiert (oft unnötig) und ist eine Liste. Was eine Liste und was ein Set ausmacht, kannst du in der Doku nachlesen.


----------



## xysawq (12. Jun 2008)

Auch wenn es Schnee von gestern ist, keinem ist mein Fehler aufgefallen ^^


```
for(int i=0; i<(stringArray.length - 1); i++)
{
   for(int j=(i + 1); j<stringArray.length; j++)
   {
      if(stringArray[i].equals(stringArray[j]))
      {
         String[] temp = new String[stringArray.length - 1];
         System.arraycopy(stringArray, 0, temp, 0, j);
         System.arraycopy(stringArray, j+1, temp, j, temp.length);
         stringArray = temp;
      }
   }
}
```

muss es richtig heißen... und die Steinzeitmenschen hätten sich damals eine so einfache Lösung auch gewünscht, da gabs noch keine SETs


----------



## maki (12. Jun 2008)

Anonymous hat gesagt.:
			
		

> Ist denn so ein SET auch einem Vector vorzuziehen. Bisher hab ich fast alles mit Vectoren gemacht.


Vector ist zu vermeiden, genauso wie Hashtable.
Nimm stattdessen List (LinkedList, ArrayList) und Map (HashMap).

Das Java Collection Framework sollte man auf jedenfall beherrschen wenn man in Java entwickeln will: http://java.sun.com/docs/books/tutorial/collections/index.html


----------



## Guest (12. Jun 2008)

> Vector ist zu vermeiden, genauso wie Hashtable.



 :bahnhof: warum denn das? Ich komme so gut mit Vectoren klar...


----------



## ARadauer (12. Jun 2008)

> Ist denn so ein SET auch einem Vector vorzuziehen. Bisher hab ich fast alles mit Vectoren gemacht.


in einem set gibt es jedes elemten nur einmal


----------



## ARadauer (12. Jun 2008)

> warum denn das? Ich komme so gut mit Vectoren klar...


weil es langsamer ist als eine ArrayList, benutzen tust du sie gleich...


----------



## maki (12. Jun 2008)

Anonymous hat gesagt.:
			
		

> > Vector ist zu vermeiden, genauso wie Hashtable.
> 
> 
> 
> :bahnhof: warum denn das? Ich komme so gut mit Vectoren klar...


Wenn du kein Swing einsetzt welches Vector erzwingt, solltest du die modernen Collections verwenden, Vector und Hashtable sind überbleibsel aus der pre-Collections Ära, wurden zwar nachträglich geändert, allerdings fehlt die klare Linie.


----------



## Guest (12. Jun 2008)

Anonymous hat gesagt.:
			
		

> Welchen Vorteil hat eigentlich diese Zeile:
> 
> 
> ```
> ...



An dieser Stelle bietet es keinen Vorteil. Dass ich Set statt HashSet genommen habe liegt bei mir daran, dass ich an solchen Stellen immer die Interfaces nehme wenn es möglich ist.

Bei Lists mache ich das immer genauso



```
List list = new ArrayList(); // Generics ma außen vor gelassen :)
```

Ein Vorteil kann hier vielleicht sein, dass ich bei List / Set nicht an einen festen Typ von Set / List gebunden bin. Lege ich ein HashSet an dann habe ich eben ein HashSet. Lege ich aber ein Set an (z. B. eben dann mit = new HashSet) kann ich an einer späteren Stelle aber auch sagen = new TreeSet ohne mir ein neues Objekt machen zu müssen.

Ist ein schlechtes Beispiel aber vielleicht verstehst du was ich meine


----------



## Leroy42 (12. Jun 2008)

xysawq hat gesagt.:
			
		

> Bin zu müde zum ...



Also ich weiß nicht, wie oft ich das heute bereits von dir gelesen habe,
aber so langsam werde ich durch diese Sätze auch (*gäähhnn*) zu
müde zum weiterle.... *schnarch*


----------



## xysawq (13. Jun 2008)

ohje, da hab ich mir wohl gestern einen mecker-vogel angelacht der nur mist von sich gibt... naja... kann man wohl nix machen

hoffentlich verPFEIFT der sich bald!


----------



## Leroy42 (13. Jun 2008)

xysawq hat gesagt.:
			
		

> ohje, da hab ich mir wohl gestern einen mecker-vogel angelacht der nur mist von sich gibt... naja... kann man wohl nix machen



LOL! Wenn du das als Gemeckere ansiehst, kann ich dir nicht helfen.



			
				xysawq hat gesagt.:
			
		

> hoffentlich verPFEIFT der sich bald!



In nächster Zeit, eher so mehr weniger.  ???:L


----------



## Der Müde Joe (13. Jun 2008)

Anonymous hat gesagt.:
			
		

> > Vector ist zu vermeiden, genauso wie Hashtable.
> 
> 
> 
> :bahnhof: warum denn das? Ich komme so gut mit Vectoren klar...



Vector ist eigentlich "veraltet". Mit java 1.2 kam das neue Collection Framework und
Vector wurde da reingedrückt um irgenwie zu passen. Aus kompatibilitätsgründen kann
die Klasse nicht entfernt werden. Stack erbt von Vector (brrrrrrr).

für diese Funktionalität List benutzen. Wenn synchronosiert sein soll
Collections.synchronizedList(list)


----------

