Heim >Java >javaLernprogramm >Java-Komparatorfehler: Wie behebt man „Vergleichsmethode verstößt gegen ihren allgemeinen Vertrag'?

Java-Komparatorfehler: Wie behebt man „Vergleichsmethode verstößt gegen ihren allgemeinen Vertrag'?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-14 10:07:12355Durchsuche

Java Comparator Error: How to Fix

Java-Fehler: Offenlegung der Verletzung des allgemeinen Vertrags der Vergleichsmethode

Der Fehler „Vergleichsmethode verletzt ihren allgemeinen Vertrag“ tritt auf, wenn ein Komparator definiert wird in Java hält sich nicht an das Grundprinzip der Transitivität. Dieses Prinzip schreibt vor, dass, wenn Objekt A größer als Objekt B ist und Objekt B größer als Objekt C ist, A auch größer als C sein muss.

Um diesen Fehler zu beheben, muss unbedingt sichergestellt werden, dass das definierte Der Vergleicher folgt dieser Regel strikt. Im bereitgestellten Beispiel liegt das Problem in der Methode „compareTo()“. Es sind mehrere Unstimmigkeiten erkennbar:

  1. Beim Vergleich der Kartenseltenheit gibt die Methode nicht -1 zurück, wenn card1.getRarity() größer als card2.getRarity() ist.
  2. Beim Kartenvergleich Wenn die IDs unterschiedlich sind, gibt die Methode -1 zurück, wenn die IDs nicht gleich sind, obwohl sie basierend auf der größeren ID -1 oder 1 zurückgeben sollte ID.

Um diese Fehler zu beheben, wird eine überarbeitete Version des Komparators vorgestellt:

public int compareTo(Object o) {
    if (this == o) {
        return 0;
    }

    CollectionItem item = (CollectionItem) o;

    Card card1 = CardCache.getInstance().getCard(cardId);
    Card card2 = CardCache.getInstance().getCard(item.getCardId());

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

Dieser aktualisierte Komparator stellt sicher, dass die Vergleichsmethode der Transitivitätsregel entspricht. Durch die Behebung dieser Inkonsistenzen wird der Fehler „Vergleichsmethode verstößt gegen ihren allgemeinen Vertrag“ behoben.

Das obige ist der detaillierte Inhalt vonJava-Komparatorfehler: Wie behebt man „Vergleichsmethode verstößt gegen ihren allgemeinen Vertrag'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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