Momentan schreibe ich eine compareTo Methode für quadratische Funktionen in der Form: ax ^ 2 + bx + c.
a, b, c sind ganzzahlige Koeffizienten, die über den Konstruktor an die Klasse übergeben werden.
In der compareTo-Methode soll ich zuerst die a-Koeffizienten zwischen zwei Funktionen vergleichen, aber wenn sie gleich sind, vergleiche ich die b-Koeffizienten. Wenn die b gleich sind, vergleiche ich die c.
Die Methode, für die ich mich entschieden habe, war ziemlich hässlich:
%Vor%Ich habe mich also gefragt, ob Sie diese "abgestuften" Vergleichssysteme haben (wie a's vor bs vor cs vergleichen), was ist der beste Weg, sie zu implementieren? Ich kann mir nicht vorstellen, eine Methode wie meine zu schreiben, wenn Sie mehr als 10 Variablen durchgehen müssen.
Für eine beliebige Anzahl von Koeffizienten (alle vom gleichen Typ) sollten Sie sie in einem List
(oder etwas ähnlichem) speichern, anstatt einzeln benannte Elementvariablen. Dadurch können Sie Ihren Beispielcode in eine Iteration konvertieren.
Die Guava-Bibliotheken stellen ein äußerst nützliches Tool bereit, das ComparisonChain .
Ihr Code würde etwa so aussehen:
%Vor%Aus Gründen der Lesbarkeit und um die integrierten Vergleichsmethoden für a, b, c zu verwenden, würde ich dies umgestalten:
%Vor% In diesem Code wird davon ausgegangen, dass die Felder Number
sind. Wenn sie ein primitives Element sind, wandeln Sie sie entweder in umgebrochene Typen um oder ändern Sie a.equals(b) to
a == b and change
a.compareTo (b) to
a - b '.
Beachten Sie auch, dass, wenn ein if
zurückkehrt, nie ein else
benötigt wird - es ist redundant, also entfernen Sie es.
Sie können ein Idiom wie das folgende verwenden, das den Vergleich in klare Abschnitte nach Feld aufteilt, nur einen Test pro Feld erfordert und signum
Methode, um die Rückgabewerte zu erzeugen.
Beachten Sie, dass die folgende Subtraktion für die Felder int
, short
, char
oder byte
funktioniert.
Für die Felder long
, float
und double
müssen Sie separate Prüfungen für <
und ==
verwenden, um Überlauf / Unterlauf und Genauigkeitsverlust aufgrund von Rundungen zu vermeiden. Seien Sie vorsichtig bei NaN
, wenn Sie Fließkommawerte vergleichen.
Für Comparable
-Felder können Sie delta einfach auf das Ergebnis von compareTo
setzen, nachdem Sie separate Bedingungen zur Behandlung von null
verwendet haben.
Tags und Links java comparable