Was bedeuten die Rückgabewerte von Comparable.compareTo in Java?

75

Was ist der Unterschied zwischen der Rückkehr 0, Rückkehr 1und Rückkehr -1in compareTo()in Java?

Magggi
quelle
6
compareTo kann jedoch auch -2 oder 42 zurückgeben.
Thilo
4
Probieren Sie den Javadoc einige Zeit aus.
Marquis von Lorne
24
Wenn Sie Probleme haben, sich zu erinnern (wie ich), stelle ich mir das einfach als Zahlensubtraktionsoperation vor, a-bwenn aes größer ist, ist das Ergebnis positiv (+1). Wenn bes größer ist , ist das Ergebnis negativ ... wenn sie es sind gleich sein0
st0le

Antworten:

92

Offizielle Definition

Aus den Referenzdokumenten von Comparable.compareTo (T) :

Vergleicht dieses Objekt mit dem angegebenen Objekt für die Bestellung. Gibt eine negative Ganzzahl, Null oder eine positive Ganzzahl zurück, da dieses Objekt kleiner, gleich oder größer als das angegebene Objekt ist.

Der Implementierer muss sgn (x.compareTo (y)) == -sgn (y.compareTo (x)) für alle x und y sicherstellen. (Dies impliziert, dass x.compareTo (y) eine Ausnahme auslösen muss, wenn y.compareTo (x) eine Ausnahme auslöst.)

Der Implementierer muss auch sicherstellen, dass die Beziehung transitiv ist: (x.compareTo (y)> 0 && y.compareTo (z)> 0) impliziert x.compareTo (z)> 0.

Schließlich muss der Implementierer sicherstellen, dass x.compareTo (y) == 0 impliziert, dass sgn (x.compareTo (z)) == sgn (y.compareTo (z)) für alle z.

Es wird dringend empfohlen, aber nicht unbedingt erforderlich, dass (x.compareTo (y) == 0) == (x.equals (y)). Im Allgemeinen sollte jede Klasse, die die Schnittstelle Comparable implementiert und diese Bedingung verletzt, diese Tatsache klar angeben. Die empfohlene Sprache lautet "Hinweis: Diese Klasse hat eine natürliche Reihenfolge, die nicht mit gleich übereinstimmt."

In der vorstehenden Beschreibung bezeichnet die Notation sgn (Ausdruck) die mathematische Signumfunktion, die so definiert ist, dass sie eine von -1, 0 oder 1 zurückgibt, je nachdem, ob der Wert des Ausdrucks negativ, null oder positiv ist.

Meine Version

Zusamenfassend:

this.compareTo(that)

kehrt zurück

  • ein negatives int wenn dies <das
  • 0 wenn dies == das
  • ein positives int wenn dies> das

wo die Implementierung dieser Methode die tatsächliche Semantik von < >und bestimmt ==(ich meine nicht ==im Sinne des Objektidentitätsoperators von Java)

Beispiele

"abc".compareTo("def")

ergibt etwas kleiner als 0, wie abces alphabetisch vorher ist def.

Integer.valueOf(2).compareTo(Integer.valueOf(1))

ergibt etwas größer als 0, da 2 größer als 1 ist.

Einige zusätzliche Punkte

Hinweis: Für eine Klasse, die Comparable implementiert, empfiehlt es sich, die Semantik ihrer compareTo () -Methode in den Javadocs zu deklarieren.

Hinweis: Sie sollten mindestens eines der folgenden Dokumente lesen:

Achtung: Sie nie auf den Rückgabewert von compareTo Wesen verlassen sollen -1, 0und 1. Sie sollten immer testen x < 0, x == 0, x > 0, respectively.

Sean Patrick Floyd
quelle
Denken Sie daran, in der Dokumentation, über die sie sprechen sgn(), nicht direkt -1 und 1. Sie sollten dies zu Ihrer Kurzversion hinzufügen.
Colin Hebert
Ich kenne. Ich bevorzuge echte Sprache gegenüber mathematischem Hokuspokus (Junge, bin ich froh, dass du Kommentare nicht ablehnen kannst :-)), also habe ich -1 (oder kleiner) bzw. 1 (oder größer) geschrieben .
Sean Patrick Floyd
1
Interessanterweise sagen die offiziellen Dokumente an keiner Stelle , dass eine negative int eigentlich bedeutet dies < , dass . Sie sagen nur, dass es drei verschiedene Rückgabewerte gibt: ein negatives int, null und ein positives int. Einer von ihnen bedeutet dies <das , einer bedeutet dies> das und einer bedeutet dies == das . Welches ist das, was die Dokumente zu keinem Zeitpunkt spezifizieren - tatsächlich könnte man sagen, die Autoren haben sich bemüht, um dieses Detail herum zu schreiben und es offen zu lassen.
ODER Mapper
@ ORMapper Ich bin anderer Meinung. "Gibt eine negative Ganzzahl, Null oder eine positive Ganzzahl zurück, da dieses Objekt kleiner, gleich oder größer als das angegebene Objekt ist." Der Teil "wie dieses Objekt ist" ordnet Ganzzahlen Beziehungen zu.
Sean Patrick Floyd
1
@kojow Ich bin nicht auf eine solche Implementierung gestoßen, aber der Vertrag besagt eindeutig : "Gibt eine negative Ganzzahl, eine Null oder eine positive Ganzzahl zurück, da dieses Objekt kleiner, gleich oder größer als das angegebene Objekt ist."
Sean Patrick Floyd
49

Ich benutze diese Mnemonik:

a.compareTo(b) < 0 // a < b

a.compareTo(b) > 0 // a > b

a.compareTo(b) == 0 // a == b

Sie behalten die Zeichen und vergleichen das Ergebnis immer compareTo()mit 0

Colin Hebert
quelle
1
Dies ist perfekt!
Mvorisek
Ich benutze diese nur numerische Version, um mich leicht zu erinnern : a.compareTo(b) = a - b.
Hockendes Kätzchen
@CrouchingKitten a-bsollte niemals in einer Implementierung von compareTo () in echtem Code verwendet werden, da es überlaufen kann (und wird).
Clement Cherlin
27

Antworte kurz: (suche deine Situation)

  • 1 .compareTo ( 0 ) ( Rückgabe : 1 )
  • 1 .compareTo ( 1 ) ( Rückgabe : 0 )
  • 0 .comapreTo ( 1 ) ( Rückgabe : -1 )
user1012506
quelle
2
Tolle Antwort zum schnellen Nachschlagen.
Juzer Ali
5

Nehmen Sie ein Beispiel, wenn wir "a" und "b" vergleichen möchten, dh ("a" == this)

  1. negativ int wenn a <b
  2. wenn a == b
  3. Positiv int wenn a> b
Bhavesh
quelle
3

Es kann zum Sortieren verwendet werden, und 0 bedeutet "gleich", während -1, und 1 bedeutet "weniger" und "mehr (größer)".

Jeder Rückgabewert, der kleiner als 0 ist, bedeutet, dass der linke Operand kleiner ist. Wenn der Wert größer als 0 ist, ist der linke Operand größer.

Michał Niklas
quelle
2
Es ist negativ, positiv und 0, nicht einfach -1, 1 und 0
Colin Hebert
Colin, da war -1, 0 und 1 in Frage. Und ja, während einige Komparatoren nur einen dieser Werte zurückgeben, können andere jeden Wert zurückgeben, wobei negativ bedeutet, dass der linke Operand kleiner ist, Null bedeutet, dass beide Operanden gleich sind, und positiv bedeutet, dass links übrig bleibt. Außerhalb des Java-Landes funktioniert das wie strcmp()bei C.
Michał Niklas
2
int x = thisObject.compareTo(anotherObject);

Die compareTo()Methode gibt ein int mit den folgenden Merkmalen zurück:

  • Negativ If thisObject < anotherObject
  • Null If thisObject == anotherObject
  • positiv If thisObject > anotherObject
Artur Yolchyan
quelle
0

System.out.println (A.compareTo (B)> 0? "Ja": "Nein")

Wenn der Wert von A> B ist, wird "Ja" oder "Nein" zurückgegeben.

Chaitanya Vibhu
quelle
1
Denken Sie, dass Ihre Antwort zu der Frage passt?
Prasanth Rajendran
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können
Nico Haase