Wie implementieren Sie compareTo-Methoden sauber?

8

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.

    
CowZow 15.01.2012, 19:12
quelle

4 Antworten

6

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.

    
Oliver Charlesworth 15.01.2012, 19:14
quelle
2

Die Guava-Bibliotheken stellen ein äußerst nützliches Tool bereit, das ComparisonChain .

Ihr Code würde etwa so aussehen:

%Vor%     
Louis Wasserman 15.01.2012 23:31
quelle
1

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.

    
Bohemian 15.01.2012 19:24
quelle
0

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.

%Vor%     
Mike Samuel 15.01.2012 19:18
quelle

Tags und Links