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; } ... }
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; } ...
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!