Ich möchte eine Klasse in SortedSet
| nutzbar machen SortedMap
.
Die Instanzen der Klasse müssen nach ihrer Namenseigenschaft sortiert sein.
Ich möchte jedoch nicht, dass gleichnamige Instanzen als gleich angesehen werden.
Also würde ein SortedSet
Inhalt wie a, a, a, b, c aussehen.
(Normalerweise erlaubt SortedSet
nur a, b, c )
Zuallererst: Ist das (philosophisch) konsistent?
Wenn ja, muss ich unvorhersehbares Verhalten erwarten, wenn ich es nicht tue
override equals(...)
und hashCode()
?
Bearbeiten:
Es tut mir leid, meine Frage scheint inkonsistent zu sein:
Ich möchte mehrere "gleiche" Werte in einen Satz einfügen, was dies nicht erlaubt
nach Konzept.
Also, bitte antworte nicht mehr auf meine Frage.
Danke an alle, die schon geantwortet haben.
Lassen Sie mich Ihnen eine Frage stellen: Ist es sinnvoll, a.compareTo(b)
return 0 und a.equals(b)
return false
?
Ich würde stattdessen eine Comparator<MyClass>
verwenden. Das ist der Grund, warum alle SortedMap
/ SortedSet
Implementierungen, die ich kenne, Ihnen erlauben, bei der Erstellung ein Comparator
zu übergeben.
Aus dem Javadoc für Vergleichbares
Es wird dringend empfohlen (obwohl nicht erforderlich) dass natürliche Ordnungen sein müssen konsistent mit Gleichgestellten. Das ist so weil sortierte Sätze (und sortierte Karten) ohne explizite Komparatoren zu verhalten " seltsam ", wenn sie verwendet werden Elemente (oder Schlüssel), deren natürliche Bestellung ist inkonsistent mit gleich
Wenn Sie compareTo inkonsistent mit equals () haben möchten, sollten Sie stattdessen einen expliziten Komparator verwenden, indem Sie eine Klasse bereitstellen, die Comparator implementiert.
Wenn ja, muss ich unvorhersehbares Verhalten erwarten, wenn ich equals (...) und hashcode () nicht überschreibe?
Sie sollten weiterhin equals () und hashcode () überschreiben. Ob equals () und hashcode () mit compareTo übereinstimmen, ist eine andere Sache.
Effektives Java empfiehlt, dass Sie, wenn Sie compareTo
nicht konsistent mit equals
implementieren, sollten deutlich angeben:
Die empfohlene Sprache ist "Hinweis: Diese Klasse hat eine natürliche Reihenfolge ist inkonsistent mit Gleichgestellten. "
Tags und Links java collections