2015-06-28 9 views
5

Ich arbeitete an einer sortierten Liste und kam zu einem Punkt, den ich brauchte, um eine compareTo() Funktion für primitive lange Werte zu implementieren.Wirksames compareTo() für primitives langes

Ich bin nicht auf der Suche nach der offensichtlichen naiven Implementierung, aber fragte mich, ob es einen eleganten Ein-Liner-Code, um das zu tun (ohne eine neue Long (Wert)) zu tun.

Vielleicht so etwas wie:

@Override public int compareTo(MyClass that) { 
    return (int) ((value - that.value) >>> 32); 
} 

Kann das jemand bestätigen funktionieren würde, und/oder eine andere Implementierung vorschlagen?

Antwort

10

One Liner-Code, dass:

int res = Long.compare(long x, long y) 

Ihr Code wird nicht korrekt für alle Werte funktioniert, versuchen Sie es für Integer.MIN_VALUE - Integer.MAX_VALUE und Sie erhalten +1

+0

Das ist im Grunde die naive Implementierung, die in '(x traveh

+1

@traveh Ich würde Korrektheit über die Leistung sagen. Außerdem könnte die Methode ohnehin vom JDK optimiert werden. –

+0

@ E_net4 Dem stimme ich im Allgemeinen zu, aber nehmen wir mal an, dass es sich um einen Spezialfall handelt, bei dem Leistung entscheidend ist. – traveh

1

Ihr Algorithmus ist falsch , wie es 0 zurückgibt, wenn vergleichen 1 und 0 gestellt:

(1 - 0) >>> 32 
1 >>> 32 
0 

Im allgemeinen bin ich nicht sicher, ob es möglich ist, sehnt sich ohne Sprungbefehle zu vergleichen, da die Differenz von zwei Longs passen möglicherweise nicht lange, ohne zu überlaufen, was das Vorzeichen des Unterschieds verändern würde.

Ich stimme daher Evgeniys Antwort zu, dass die Verwendung der JDK-Implementierung wahrscheinlich der beste Ansatz ist.