Set erklären dass objekte gleich sind

Underfaker

Bekanntes Mitglied
Hallo zusammen,

ich würde gerne ein Set (bspw. Hashset) anwenden um Doppelungen in meinen Objekten auszusieben, dabei erkennt es allerdings nicht ob meine Objekte "gleich" sind um das eben auch umzusetzen.

Ist es möglich einem Set zu erklären wann meine Objekte gleich sind um sie dann rauszuschmeißen?

Vielen Dank und beste Grüße
 
Hallo,

überschreib die equals-Methode, die deine Objekte von der Klasse "Object" erben. Die Set-Klasse verwendet diese Methode zum Prüfen auf Gleichheit. Das Standardverhalten ist eine Prüfung, ob sich beide Objekte auf den gleichen Speicher beziehen, d.h. es macht das gleiche wie ==.

Bei einer eigenen Implementierung von equals kann man viel verkehrt machen, lies am besten einmal diesen Abschnitt: Galileo Computing :: Java ist auch eine Insel – 9.3 Object ist die Mutter aller Klassen
 
Zuletzt bearbeitet:
Equals habe ich schon implementiert und läuft auch perfekt, das Set greift leider nicht darauf zu, kann es sein, dass implements comparable das Problem behebt?

[edit] das hilft bei einem TreeSet (scheinbar) aber nich bei einem HashSet..
 
Zuletzt bearbeitet:
Welche konkrete Set-Implementierung verwendet du? Falls es ein HashSet ist, musst du auch die hashCode-Methode korrekt implementieren, denn equals wird von einem HashSet nur aufgerufen, wenn der hashCode identisch ist. Ein Comparable ist nicht erforderlich, da ein Set nur eine Äquivalenzrelation benötigt, aber keine Ordnung.
 
Hallo und danke.

Mein problem ist, dass ich auf Arrays bzw. verzweigten Arrays arbeite, kann ich das dafür auch machen?
Wenn ich jetzt ein solches Array in den Hash gebe, dann wirft er keine Doppelungen raus, bei dem Objekt selber macht er es.

Danke im Voraus.
 
Da du bei Arrays weder equals noch hashCode überschreiben kannst, ist das nicht möglich. Du müsstest dir einen eigene Klasse basteln, die die Einträge aufnimmst. equals und hashCode dieser Klasse könntest du dann iterativ implementieren: Bei equals in einer Schleife die enthalteen Elemente beider Objekte mit equals vergleichen und false zurückgeben, sobald ein Vergleich false ist. Bei hashCode würde ich ein einer Schleife die hashCodes aller enthaltenen Objekte via exklusiv-oder verknüpfen.

Edit: Hast du mal überlegt, statt Set + Arrays einfach einen sortierten Baum zu implementieren? Da merkst du ja beim Einfügen, ob der Wert schon vorhanden ist.
 
Zuletzt bearbeitet:
Ich dachte mir das shcon mit der eigenen Klasse und habe die mal gerade geschrieben und es läuft auch (auch wenns leider etwas mehr Arbeit ist).
Ich bin nicht sicher ob das mit dem exklusivoder funktioniert und wenn weiß ich nicht wie.

Bis auf bei einem TreeSet hatte ich bisher nichts mit Bäumen zu tun.
 
Nachgeschaut, die ArrayList macht es z.B. so:

Java:
public int hashCode() {
    int hashCode = 1;
    Iterator<E> i = iterator();
    while (i.hasNext()) {
        E obj = i.next();
        hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
    }
    return hashCode;
}

Das bedeutet übrigens auch, dass du eine ArrayList ohne Änderung in ein Set packen könntest, vielleicht wäre das die schnellste Lösung.
 
Ok diese Syntax: (obj==null ? 0 : obj.hashCode()) kenne ich nicht, habe etwas Eigenes implementiert was sicher funktioniert aber nciht so "gut" ist.

Ist deine Idee, dass ich ArrayListen in das Set packen soll?
 
Code:
x = (obj==null ? 0 : obj.hashCode())
ist eine kurze Schreibweise für
Java:
if(obj == null) {
  x = 0;
} else {
  x = obj.hashCode();
}

Da eine ArrayList equals und hashCode korrekt implementiert, könntest du ein Set<ArrayList<DeineKlasse>> nehmen und müsstest hashCode und equals dann nur in deiner Klasse implementieren, dann geht alles.
 
Also soll ich statt einem Array eine ArrayList nehmen, seh ich das richtig?
In diesem Fall ist das der denkbar schlechteste Weg, da unser ganzes Projekt auf verzweigten Arrays aufbaut, wir bilden damit Tableaus (analog zu Matrizen) ab.
 
Aber die ArrayList kann doch auch verzweigen? Was kannst du mit einem Array machen, was mit einer ArrayList nicht geht?
 
Das Problem ist, dasswir bereits über 10.000 Codezeilen produziert haben die auf solchen Arrays basieren, das alles zu ändern erschiene mir doch etwas übertrieben.
Jedenfalls habe ich das mit der Hashfunktion nun so drin, dass ich eine eigene benutze für eine Objektklasse "Tableau" in der einfach ein solches verzweigtes Array gesetzt wird.

Ich danke dir für deine Mühen.
 

Zurück
Oben