Working on a sorted list I came to a point I needed to implement a compareTo() function for primitive long values.
I'm not looking for the obvious naive implementation, but was wondering if there's an elegant one-liner code to do that (without creating a new Long(value)).
Maybe something like this:
@Override public int compareTo(MyClass that) {
return (int) ((value - that.value) >>> 32);
}
Can anyone verify that would work and/or suggest another implementation?
equals() instead of the reference comparison operator (==). This is because Java maintains a constant pool for instances of Long between -128 and 127. This optimization, though, does not give us a license to use ==.
The java. lang. Long. compareTo() method compares two Long objects numerically.
equals() is a built-in function in java that compares this object to the specified object. The result is true if and only if the argument is not null and is a Long object that contains the same long value as this object. It returns false if both the objects are not same.
One liner code to that:
int res = Long.compare(long x, long y)
Your code wont work correctly for all values, try it for Integer.MIN_VALUE - Integer.MAX_VALUE and you will get +1
Your algorithm is incorrect, as it returns 0 when asked to compare 1 and 0:
(1 - 0) >>> 32
1 >>> 32
0
In general, I am not sure it is possible to compare longs without branch instructions, because the difference of two longs may not fit in a long without overflowing, which would change the sign of the difference.
I therefore agree with Evgeniy's answer that using the JDK implementation is likely the best approach.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With