Java ArrayList<String[][][][]> Doppelte Werte Löschen

nintendoluk

Commander
Registriert
Mai 2014
Beiträge
2.124
Hi zusammen,

ich will doppelte Werte in meiner ArrayList löschen.

Normalerweise würde ich die Liste sortieren, durchlaufen und die Werte immer mit Ihren direkten Nachbarn vergleichen.
Dummerweise kann ich 4D-String-Arrays nicht sortieren, weshalb ich eine andere Möglichkeit brauche (Außer, dass ich alles mit allem vergleiche, das würde zu viel Leistung brauchen)

Danke & Gruß
Lukas
 
Beschriebe doch einfach was du machen möchtest, dann wird dir vielleicht jemand eine besseren Lösungsansatz liefern ;)
 
Ok, zur besseren Vorstellung:

Code:
String[][][][] a4d1 = {{{{"1", "2"}},{{"3", "4"}}},{{{"5", "6"}},{{"7", "8"}}}};
String[][][][] a4d2 = {{{{"A", "B"}},{{"C", "D"}}},{{{"E", "F"}},{{"G", "H"}}}};
String[][][][] a4d3 = {{{{"1", "2"}},{{"3", "4"}}},{{{"5", "6"}},{{"7", "8"}}}};
		
ArrayList<String[][][][]> myList = new ArrayList<String[][][][]>();

myList.add(a4d1);
myList.add(a4d2);
myList.add(a4d3);
		
//doppelteWerteLöschen(myList);
		
return myList;

a4d3 soll am Ende nicht mehr in der Liste sein
 
Bau dir eine Hashmap auf und wenn ein Element mit dem gleichen Hash schon drin ist, vergleichst du und bei Gleichheit schmeißt du eins von beiden Elementen Weg. Das scheint für mich der schnellste Weg zu sein.
 
Für Duplikat-Kram, sollte man einfach immer ein HashSet oder HashMap verwenden. Und eine entsprechende hashCode und equals Methode implementieren.
 
Genau... und so wurde dein Problem auf eine bessere Art gelöst ;)
 
Nein, so:
Code:
HashMap<String, String[][][][]> test = new HashMap<String, String[][][][]>();
Und dann so hinzufügen:
Code:
test.put("a4d1", {{{{"1", "2"}},{{"3", "4"}}},{{{"5", "6"}},{{"7", "8"}}}});

Edit:
Und hier als HashSet:
Code:
String[][][][] a4d1 = {{{{"1", "2"}},{{"3", "4"}}},{{{"5", "6"}},{{"7", "8"}}}};
HashSet<String[][][][]> test = new HashSet<String[][][][]>();
test.add(a4d1);
Duplikate entfernen, da sollte dir Google schnell eine Antwort liefern.
 
Zuletzt bearbeitet:
Vielen dank, ich Nehms HashSet ^^

Kann ich eine ArrayListe auch irgendwie direkt in ein HashSet umwandeln und auch wieder zurück?

Ich hab mein Programm schon fertig und hab nur ein paar Bugs (wie zB. doppelte Ergebnisse) und möchte nicht alles umschreiben zu HashSet...

Ansonsten Bau ich halt ne Schleife dafür..
Ergänzung ()

Ok vergesst es wieder bin schon soweit

Code:
	 public static ArrayList<String[][][][]> removeDuplicatedEntries(ArrayList<String[][][][]> list) {

		 HashSet<String[][][][]> myHash = new HashSet<String[][][][]>();
		 
		 for(int i = 0; i < list.size(); i++)
		 {
			 
			 myHash.add(list.get(i));
			 
		 }
		 
		 //Duplikate Löschen
		 
		 ArrayList<String[][][][]> newList = new ArrayList<String[][][][]>();
		 
		 for(int i = 0; i < myHash.size(); i++)
		 {
			 
			 newList.add(myHash.get(i));
			 
		 }
		 
		 return list;
		 
	 }
 
Ja das geht einfach so:
Code:
HashSet<String[][][][]> hashset = new HashSet<String[][][][]>();
ArrayList<String[][][][]> list = new ArrayList<String[][][][]>(hashset);
 
Danke, das macht meinen Quellcode etwas hübscher ^^
Ergänzung ()

.

http://blog.mynotiz.de/tag/arraylist-duplikate-loschen/

Kann es sein, dass der HashSet schon von Haus aus Duplikate löscht?


Habs getestet, der HashSet löscht in meinem Fall keine Duplikate.

Und im Internet finde ich nichts anderes als Quellcode, der zum Set wandelt und dann wieder zurück...

Ich brauche weiterhin Hilfe!
 
Zuletzt bearbeitet:
Gottchen, Java hat eine der besten Dokumentationen überhaupt. Und die vom HashSet ist nun wirklich einfach: http://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html
Und natürlich brauchst du noch die vom Set: http://docs.oracle.com/javase/8/docs/api/java/util/Set.html

"A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element."

solang deine Objekte nicht auf "equals" anspringen, bringt dir ein HashSet natürlich nix. Also schreibst du 'ne Klasse die sein 4D-Array kapselst und implementierst equals entsprechend.
 
Mhm, ich habs jetzt einfach 2 Schleifen geschrieben, in denen alles mit allem über deepEquals verglichen wird.
Ist zwar nicht der fein englische Weg, aber das Programm braucht dadurch nur etwa eine Sekunde länger...

Dass ich den 4D-Array in eine Klasse umwandle, braucht ja auch wieder einiges an Rechenleistung, ich denke da ist mein Weg etwa genau so schnell.
 
Zurück
Oben