Heim > Java > javaLernprogramm > Warum gibt mein Java-Komparator den Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag' aus?

Warum gibt mein Java-Komparator den Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag' aus?

Barbara Streisand
Freigeben: 2025-01-04 15:15:39
Original
868 Leute haben es durchsucht

Why Does My Java Comparator Throw a

Java-Fehler: „Vergleichsmethode verletzt ihren allgemeinen Vertrag“

Beim Sortieren von Sammlungen verwendet Java eine Vergleichsmethode, um die Objektreihenfolge festzulegen. Diese Methode muss jedoch dem Transitivitätsprinzip entsprechen, das besagt, dass A größer als C sein muss, wenn Objekt A größer als B und B größer als C ist. Unter bestimmten Umständen kann dieser Vertrag verletzt werden, was zu „ Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag“.

Beispiel

Betrachten Sie den folgenden benutzerdefinierten Komparator, der Objekte nach bestimmten Kriterien sortieren soll. Aufgrund logischer Inkonsistenzen verstößt es jedoch gegen die Transitivitätsregel:

@Override
public int compareTo(Object o) {
    ...
    if (card1.getRarity() < card2.getRarity()) {
        return 1;
    }
    ...
    if (card1.getSet() > card2.getSet()) {
        return -1;
    }
    ...
}
Nach dem Login kopieren

Transitivitätsproblem

Im obigen Beispiel, wenn card1.getRarity() ausschlaggebend ist Faktor und card1.getRarity() kleiner als card2.getRarity() ist, gibt der Komparator korrekt 1 zurück. Wenn jedoch card2.getSet() der entscheidende Faktor ist und card2.getSet() kleiner als card1.getSet() ist, gibt der Komparator fälschlicherweise -1 zurück. Dies führt zu einer nicht-transitiven Situation.

Richtige Lösung

Um Transitivität sicherzustellen, sollte der Komparator der folgenden Logik folgen:

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

Um den Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag“ zu vermeiden, stellen Sie zusammenfassend sicher, dass Ihre Vergleichsmethode dem Transitivitätsprinzip entspricht. Diese Regel schreibt vor, dass A größer als C sein muss, wenn Objekt A größer als B und B größer als C ist. Durch die Gewährleistung der Transitivität garantieren Sie ein konsistentes und korrektes Sortierverhalten.

Das obige ist der detaillierte Inhalt vonWarum gibt mein Java-Komparator den Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag' aus?. 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