Collections vergleichen

stso

Mitglied
Hallo,
ich habe 2 Liste und möchte diese vergleichen. Die Reihenfolge der Elemente soll egal sein.
Code:
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(new Integer[]{1,2,3,4,5}));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(new Integer[]{5,1,3,2,4}));
		
boolean isEqual = list1.equals(list2);

Leider scheint "equals()" nur "true" zu sein, wenn auch die Reihenfolge der Elemente stimmt. Alternativ ist mir folgenden Möglichkeit eingefallen:
Code:
boolean isEqual2 = (list1.size() == list2.size()) && list1.containsAll(list2);

Könnte zu langsam sein? (Java- Ultras gefragt! ;))
Ich vermute mal das ich nur auf dem Schlauch stehe. Gibt es eine (möglichst effiziente) Möglichkeit 2 Collections unäbhängig von ihrer Reihenflge auf ihre "Gleichheit" zu überprüfen?
 

zeja

Erfahrenes Mitglied
Kommt drauf an wie groß die Listen sind, wie oft du das durchführst und ob nicht vielleicht ein Set auch in Ordnung ist.

Aber wenns dir nicht massiv im Performance geht sollte das eigentlich in Ordnung sein.
 

stso

Mitglied
Hallo zeja,
vielen Dank für deine Antwort. In meinem Anwendungsfall kann die Zahl der Elemente in der Liste schon mal auf 100000 ansteigen - schätze ich :). "Set" war ein gutes Stichwort. Das liefert für "equals()" true zurück- auch wenn die Reihenfolge nicht übereinstimmt. Laut Definition ist eine Set ja auch eine "ungeordnete Sammlung" von Elementen.
Problematisch wird es mit der Einschränkung das jedes Element nur einmal vorkommen darf. Aber für mein obiges Beispiel würde es funktionieren.

Code:
Set<Integer> set1 = new HashSet<Integer>(Arrays.asList(new Integer[]{1,2,3}));
Set<Integer> set2 = new HashSet<Integer>(Arrays.asList(new Integer[]{1,3,2}));
Set<Integer> set3 = new HashSet<Integer>(Arrays.asList(new Integer[]{1,3,2,1}));
Set<Integer> set4 = new HashSet<Integer>(Arrays.asList(new Integer[]{1,2,3,1}));

boolean isEqual3 = set1.equals(set2);//ist true
boolean isEqual4 = set3.equals(set4);//ist true

Gibt es eigentlich eine Collection die eine ungeordnete Menge von Elementen beinhaltet in der aber auch Elemente mehrfach auftreten können? Warum funktioniert das mit der doppelten '1' bei den Integer- Werten? Da ist doch equals()->true?! Oder dürfen keine identischen Objekte in der Liste abgelegt werden?
 

zeja

Erfahrenes Mitglied
Du packst die Liste in ein Set, dadurch gehen alle doppelten verloren.

Wenn du eine Liste mit doppelten Werten hast, kannst du diese auch sortieren (Collections.sort(lst)) und dann mit equals vergleichen. Wenn du auf einmal immer viele Werte einfügst und die Liste zwischen zweimal einfügen häufiger verglichen wird könntest du sie nach einem einfügen sortieren, so dass sie immer sortiert gehalten wird.

Mußt du mal schauen was für dich am Besten ist.
 

shutdown

Erfahrenes Mitglied
Schau dir mal die Collections TreeSet und TreeMap an. Diese sind von vornherein sortiert - ein nachträgliches bei 1000000 Einträgen sehr aufwändiges sortieren entfällt. Dafür dauert das Einfügen etwas länger, in der Summe aber weitem nicht so lange, wie alles auf einmal zu sortieren.
 

stso

Mitglied
Hallo,
auf die Idee die Listen zu sortieren bin ich gar nicht gekommen - das wäre in meinem Anwendungsfall möglich. Dann werd ichs wohl so machen!

Vielen Dank für eure Antworten!