7 Stimmen

Ist es sinnvoll, dass equals und compareTo inkonsistent sind?

Ich möchte eine Klasse nutzbar machen in SortedSet | SortedMap .

class MyClass implements Comparable<MyClass>{
  // the only thing relevant to comparisons:
  private final String name;

  //...
}

Die Instanzen der Klasse müssen nach ihrer Namenseigenschaft sortiert werden.
Ich möchte jedoch nicht, dass gleichnamige Instanzen als gleichwertig betrachtet werden.

Also ein SortedSet Der Inhalt würde wie folgt aussehen a, a, a, b, c .
(Normalerweise, SortedSet würde nur erlauben a, b, c )

Erstens: Ist dies (philosophisch) konsequent?

Wenn ja, muss ich mit unvorhersehbarem Verhalten rechnen, wenn ich es nicht außer Kraft setze. equals(...) y hashCode() ?

Bearbeiten:
Es tut mir leid, aber meine Frage scheint widersprüchlich zu sein:
Ich möchte die mehrere "gleiche" Werte innerhalb einer einstellen. die dies nicht zulässt nach dem Konzept.
Bitte antworten Sie also nicht mehr auf meine Frage.
Vielen Dank an alle, die bereits geantwortet haben.

0 Stimmen

Warum nicht einfach einen anderen Sammlungstyp verwenden?

0 Stimmen

Ja, das MultiSet | MultiMap der google-collection-API scheint dafür gut geeignet zu sein. Ich hoffe so sehr, dass die Sun-, ähm, Oracle-Jungs eines Tages Funktionalität zur Java-Sammlungs-API hinzufügen würden...

17voto

Michael Myers Punkte 183216

Ich möchte Ihnen eine Frage stellen: Ist es sinnvoll, dass a.compareTo(b) 0 zurückgeben und a.equals(b) return false ?

Ich würde eine Comparator<MyClass> stattdessen. Aus diesem Grund sind alle SortedMap / SortedSet Implementierungen, die ich kenne, erlauben die Übergabe einer Comparator bei der Erstellung.

0 Stimmen

Ich würde eher antworten: Es macht keinen Sinn ;) Danke, ich hatte vergessen, dass es so etwas wie einen Komparator gibt ;)

4voto

Laplie Anderson Punkte 6167

Aus der Javadoc für Comparable

Es wird dringend empfohlen (wenn auch nicht dass natürliche Ordnungen mit Gleichen übereinstimmen. Dies ist so weil sortierte Mengen (und sortierte Karten) ohne explizite Komparatoren verhalten sich " Seltsamerweise ", wenn sie verwendet werden mit Elementen (oder Schlüsseln), deren natürliche Reihenfolge nicht mit Gleichheitszeichen vereinbar ist

Wenn Sie compareTo mit equals() inkonsistent machen wollen, wird empfohlen, stattdessen einen expliziten Komparator zu verwenden, indem Sie eine Klasse bereitstellen, die Comparator implementiert.

Wenn ja, muss ich mit unvorhersehbarem Verhalten rechnen, wenn ich equals(...) und hashcode() nicht überschreibe?

Sie sollten trotzdem equals() und hashcode() außer Kraft setzen. Ob equals() und hashcode() mit compareTo übereinstimmen oder nicht, ist eine andere Frage.

2voto

Fabian Steeg Punkte 43903

Leistungsfähiges Java empfiehlt, dass Sie, wenn Sie nicht die compareTo im Einklang mit equals sollten Sie dies deutlich angeben:

Die empfohlene Sprache ist "Hinweis: Diese Klasse hat eine natürliche Ordnung, die nicht mit Gleichen übereinstimmt."

0voto

Azder Punkte 4558

Fügen Sie diesen Code einfach in die Gleichheitsmethode ein und denken Sie nie wieder daran:

public boolean equals(Object obj) {
    if (this == obj) return true;
    if (!(obj instanceof MyClass)) return false;
    return 0 == this.compareTo((MyClass) obj);
}

0 Stimmen

Wenn Sie jedoch equals() implementieren, müssen Sie auch hashcode() implementieren. Sonst können seltsame Dinge passieren.

0 Stimmen

Sie können hashCode an eine andere Eigenschaft oder eine Methode delegieren, die einen vergleichbaren int-Wert zurückgibt. Aber nicht stören, da hashCode ist wie die Überprüfung, ob seine eine gleiche Referenz, nicht wenn sie den gleichen Wert haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X