2015-06-14 14 views
5

Ich kenne Standardvergleiche mit der Vergleichsschnittstelle, obwohl ich heute Schwierigkeiten habe, wenn ich mehrere verschiedene Variablen vergleichen möchte.Vergleichbar verwenden, um verschiedene Variablen zu vergleichen

Ich mag im Grunde eine compareTo Methode implementieren, die das Ergebnis -1 nur, wenn die folgenden if-Anweisung wahr ergibt:

if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) 

Obwohl, ich bin nicht sicher, ob dies möglich ist, mit einem vergleichbar oder mir ist es nicht so vertraut, wie es scheint. Denn wenn ich versuche, den Ansatz

public int compareTo(IsoSprite o) { 
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ){ 
     return -1; 
    }else if(o.maxX < minX && o.maxY < minY && o.minZ > maxZ){ 
     return 1; 
    } 
    return 0; 
} 

ich die Fehlermeldung „Vergleichsmethode seines allgemeinen Vertrag verletzt!“. Ich möchte klarstellen, dass ich keine Hilfe brauche, um zu verstehen, was dieser Fehler bedeutet, weil ich mehrere Fragen dazu gelesen habe. Obwohl ich mich immer noch nicht mit diesem speziellen Problem befassen kann, weil die Lösungen zu den anderen Fragen, die ich gelesen habe, trivial waren.

Ich würde wirklich einige Hilfe mit diesem Vergleich schätzen, es wäre ein Lebensretter. Jede Eingabe wird ebenfalls sehr geschätzt.

Edit: Nach der Prüfung um, ich habe etwas bekam, die fast funktioniert (nicht in allen Fällen), aber ich kann nicht herausfinden, warum:

public int compareTo(IsoSprite o) { 
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) { 
     return -1; 
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) { 
     return 1; 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    }else if(this != o){ 
     return 1; 
    } 
    return 0; 
} 
+1

http://stackoverflow.com/questions/8327514/comparison-method-violates-its-general-contract die oberste Antwort könnte nützlich sein – twentylemon

+3

Sie wissen, dass Ihr Code gegen den allgemeinen Vertrag von Comparable verstößt (möglicherweise durch einen Fehler bei der Transitivitätsregel). , dann kann es nicht zum Sortieren verwendet werden. Zeitraum. Ihre Frage kann ein [XY-Problem] (http://mywiki.wooled.org/XyProblem) sein, in dem Sie fragen, wie Sie ein bestimmtes Codeproblem lösen können, wenn die beste Lösung darin besteht, einen völlig anderen Ansatz zu verwenden. Besser, dass Sie uns das Gesamtproblem mitteilen, das Sie lösen möchten, und nicht, wie Sie es gerade lösen wollen. –

+0

@HovercraftFullOfEels Es ist nicht nur dieses spezielle Problem, ich habe auch schon einmal Probleme wie diese gehabt, irgendwie scheint es, als könnten sie mit einem vergleichbaren irgendwie gelöst werden – Deminth

Antwort

2

Wenn Sie diese verwenden, um Ihre Objekte zu sortieren, dann muss sich Ihr Comparable oder Comparator gut benehmen und die transitiven und anderen Regeln respektieren. Wenn nicht, ist Ihr Code kaputt. Es wird empfohlen, dass Ihre Vergleichsmethoden konsistent mit equals sind, das heißt, dass a.compareTo (b) genau dann 0 zurückgibt, wenn a.equals (b), aber anders als in einer gelöschten Antwort angegeben, ist dies keine absolute Anforderung .

Ihr Code noch eine kommutative wie Regel bricht nämlich für den Vergleich, dass

a.compareTo(b) == -b.compareTo(a) 

die an Ihre Regeln aussehen lassen:

public int compareTo(IsoSprite o) { 
    // Comparison A 
    if (o.maxX > minX && o.maxY > minY && o.minZ < maxZ) { 
     return -1; 
    // Comparison B 
    } else if (o.maxX > minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison C 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison D 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison E 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    // Comparison F 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison G 
    }else if (o.maxX < minX && o.maxY < minY && o.minZ > maxZ) { 
     return 1; 
    // Comparison H 
    }else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) { 
     return 1; 
    // Comparison I 
    }else if (o.maxX < minX && o.maxY > minY && o.minZ < maxZ) { 
     return 1; 
    // Comparison J 
    }else if(this != o){ 
     return 1; 
    } 
    return 0; 
} 

Blick auf "Vergleich C":

}else if (o.maxX < minX && o.maxY > minY && o.minZ > maxZ) { 

, die 1 zurückgibt. Die Umkehrung von dies sollte -1 zurückgeben, aber es nicht, da wir die Umkehrung in "C finden ERGLEICH H ":

}else if (o.maxX > minX && o.maxY < minY && o.minZ < maxZ) { 

Aber es gibt auch 1. So hier (und möglicherweise auch anderswo) a.compareTo (b) ist gleich nicht der - von b.compareTo (a).

+0

Du hast recht, es kann nicht als vergleichbares gelöst werden – Deminth

Verwandte Themen