在排序列表上工作我得到了一个点,我需要为原始long值实现compareTo()函数。
我没有寻找明显天真的实现,但是想知道是否有一个优雅的单行代码(没有创建新的Long(值))。
也许是这样的:
@Override public int compareTo(MyClass that) {
return (int) ((value - that.value) >>> 32);
}
任何人都可以验证是否有效和/或建议其他实施?
答案 0 :(得分:12)
一个班轮代码:
int res = Long.compare(long x, long y)
您的代码无法正常运行所有值,请尝试使用Integer.MIN_VALUE - Integer.MAX_VALUE,您将获得+1
答案 1 :(得分:1)
您的算法不正确,因为当要求比较1和0时它返回0:
(1 - 0) >>> 32
1 >>> 32
0
一般来说,我不确定是否可以比较没有分支指令的长子,因为两个长子的差异可能不适合长而没有溢出,这会改变差异的符号。
因此,我同意Evgeniy的回答,即使用JDK实现可能是最好的方法。
答案 2 :(得分:0)
我发现此替代解决方案与您建议的类似:
public static int signum(long i) {
return (int) ((i >> 63) | (-i >>> 63));
}
我不能相信该解决方案,它是以下方面的实现: https://docs.oracle.com/javase/7/docs/api/java/lang/Long.html#signum(long)
根据您的示例,我将其用作:
@Override public int compareTo(MyClass that) {
return Long.signum(value - that.value);
}
正如所提到的评论之一,从内置的JDK函数开始执行常见任务是一个好主意。