Heim > Java > javaLernprogramm > Warum verstößt meine Java-Methode „compareTo' gegen den Allgemeinen Vertrag?

Warum verstößt meine Java-Methode „compareTo' gegen den Allgemeinen Vertrag?

Susan Sarandon
Freigeben: 2024-12-15 02:13:17
Original
807 Leute haben es durchsucht

Why Does My Java `compareTo` Method Violate the General Contract?

Fehler: Javas CompareTo-Methode verstößt gegen den allgemeinen Vertrag

Der Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag“ kann frustrierend sein. Trotz umfangreicher Forschung haben viele Entwickler Schwierigkeiten, dieses Problem zu lösen.

Dieser Fehler tritt auf, wenn die Methode „compareTo“, die zum Vergleichen von Objekten in Java verwendet wird, gegen die Anforderung der Transitivität verstößt. Transitivität schreibt vor, dass A größer als C sein muss, wenn A größer als B und B größer als C ist.

Im bereitgestellten Codeausschnitt wurde ein benutzerdefinierter Komparator für CollectionItems implementiert, der jedoch Fehler enthielt, die zu dem führten Verletzung der Transitivität.

Fehler 1:

if (card1.getRarity() < card2.getRarity()) {
  return 1;
}
Nach dem Login kopieren

Hier, wenn card1.getRarity() ist größer als card2.getRarity(), der korrekte Rückgabewert sollte -1 sein, nicht 1.

Fehler 2:

if (card1.getId() == card2.getId()) {
  //...
}
return -1;
Nach dem Login kopieren

Wenn die IDs nicht gleich sind, sollte der korrekte Rückgabewert -1 sein, wenn card1.getId() kleiner als card2.getId() ist, oder 1, wenn card1.getId() ist größer.

Überarbeiteter Komparator:

Um diese Fehler zu beheben, ist hier eine modifizierte Version des Komparators, die sich an die Transitivität hält:

if (card1.getSet() > card2.getSet()) {
    return 1;
}
if (card1.getSet() < card2.getSet()) {
    return -1;
};
if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
if (card1.getId() > card2.getId()) {
    return 1;
}
if (card1.getId() < card2.getId()) {
    return -1;
}
return cardType - item.getCardType();  //watch out for overflow!
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum verstößt meine Java-Methode „compareTo' gegen den Allgemeinen Vertrag?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage