[JAVA] Array kopieren, Duplikate dabei entfernen

11/08/2018 22:41 zazadi#1
Hey,

ich habe ein Array, möchte diesen kopieren um damit zu arbeiten.
Jedoch möchte ich im kopiertem Array keine Duplikate drin haben.
Habe vieles selber versucht, gegooglt aber kam zu keiner Lösung.

Beispiel

int[] original = {5,1,3,8,3,7,2,5}

int[] copy= {5,1,3,8,7,2} --sollte dann so aussehen

Das original soll wie gesagt unverändert bleiben.
Da ich noch nicht so erfahren bin, wäre es gut, wenn die Lösung dazu nicht all zu kompliziert wäre, damit ich diese auch nachvollziehen kann.
Oder vielleicht könnt ihr mir einfach sagen wie ich vorgehen sollte, und ich versuche es selber hin zu bekommen. Bin seit Stunden dran und habe es mit meinem aktuellen Wissen nicht hin bekommen.
11/09/2018 00:12 krankheit#2
was du meint nennt sich soweit ich weiß distinct
[Only registered and activated users can see links. Click Here To Register...]
11/09/2018 09:00 Zunft#3
Eine der einfachsten Möglichkeiten ist, durch das Array zu iterieren und dann die Werte zu einer Liste/einem Set hinzuzufügen. Wenn der Wert dann in dem Set schon vorhanden ist, nicht hinzufügen. Wenn du die Liste als Array brauchst, kannst du später die Liste/das Set zu einem Array konvertieren.

Code:
Set<Object> objects = new HashSet<Object>();

for(Object o : original) //Jedes Object in deinem Original Array
{
	if(!objects.contains(o)) //Wenn noch nicht im Set vorhanden
	{
		objects.add(o); //hinzufügen
	}
}

copy = objects.toArray(copy); //Set to Array
diese Lösung ist am einfachsten zu lesen, allerdings nicht der performanteste. Wenn du aber in den Array Dimensionen bleiben willst, kommst du nicht um eine verschachtelte Schleife oder Rekursion drumherum.

Code:
outerloop: //Schleifen Bezeichnung, da ein "break;" alle Schleifen beendet.
for(Object o : original) //s.O.
{
        //Folgendes ist quasi eine contains()-Methode
	boolean contains = false; 
	innerloop:
	for(Object c : copy) //Jedes Objekt in Kopie
	{
		if(c == o) //Wenn vorhanden
		{
			contains = true;
			break innerloop; //Abbrechen, weitere Suche nicht mehr nötig
		}
	}
	
	if(!contains) //Wenn nicht vorhanden
	{
		copy[copy.length] = o; //Hinzufügen
	}
}
Ist vermutlich auch nicht die beste Lösung, aber es sollte funktionieren.
11/09/2018 09:02 Serraniel#4
Mit googeln findet man das hier auch recht schnell: [Only registered and activated users can see links. Click Here To Register...] (spannend das es in Java nichts dafür gibt direkt ;o)
11/09/2018 12:12 zazadi#5
Quote:
Originally Posted by Zunft View Post

Code:
Set<Object> objects = new HashSet<Object>();

for(Object o : original) //Jedes Object in deinem Original Array
{
	if(!objects.contains(o)) //Wenn noch nicht im Set vorhanden
	{
		objects.add(o); //hinzufügen
	}
}

copy = objects.toArray(copy); //Set to Array
diese Lösung ist am einfachsten zu lesen, allerdings nicht der performanteste. Wenn du aber in den Array Dimensionen bleiben willst, kommst du nicht um eine verschachtelte Schleife oder Rekursion drumherum.
Bekomme hier folgenden error:
Code:
The method toArray(T[]) in the type Set<Object> is not applicable for the arguments (int[])
unzwar in folgender Zeile:

Code:
copy = objects.toArray(copy); //Set to Array
11/09/2018 14:04 0xFADED#6
Ich nehm bei sowas immer gern die Stream APIs von Java 8, dann ists ein einzeiler.

Code:
int[] original = {5,1,3,8,3,7,2,5};

int[] sorted = Arrays.stream(original).distinct().toArray();

Arrays.stream(sorted).forEach(System.out::println); // 5 1 3 8 7 2
11/09/2018 14:53 Zunft#7
Quote:
Originally Posted by Core ツ View Post
Bekomme hier folgenden error:
Code:
The method toArray(T[]) in the type Set<Object> is not applicable for the arguments (int[])
unzwar in folgender Zeile:

Code:
copy = objects.toArray(copy); //Set to Array
Wenn du mit Integern arbeitest musst du das Set natürlich auch auf Integer stellen. also abändern zu Set<Integer>

Quote:
Originally Posted by 0xFADED View Post
Ich nehm bei sowas immer gern die Stream APIs von Java 8, dann ists ein einzeiler.

Code:
int[] original = {5,1,3,8,3,7,2,5};

int[] sorted = Arrays.stream(original).distinct().toArray();

Arrays.stream(sorted).forEach(System.out::println); // 5 1 3 8 7 2
Eine sehr schöne Lösung, allerdings sollte ein Anfänger (Wie hier der Thread Creator) ja erstmal die Algorithmik dahinter verstehen.
11/09/2018 15:11 zazadi#8
Vielen Dank euch allen