对原始 long 有效的 compareTo()

Effective compareTo() for primitive long

在处理排序列表时,我发现我需要为原始 long 值实现 compareTo() 函数。

不是在寻找明显的天真实现,而是想知道是否有一个优雅的单行代码可以做到这一点(无需创建新的 Long(value)) .

也许是这样的:

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

任何人都可以验证是否可行and/or建议另一种实施方式吗?

一个班轮代码:

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

您的代码不会对所有值都正确工作,请尝试 Integer.MIN_VALUE - Integer.MAX_VALUE,您将获得 +1

您的算法不正确,因为当要求比较 1 和 0 时它 returns0:

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

一般来说,我不确定是否可以在没有分支指令的情况下比较longs,因为两个longs的差异可能不适合long而不会溢出,这会改变差异的符号。

因此,我同意 Evgeniy 的回答,即使用 JDK 实施可能是最好的方法。

我发现这个替代解决方案与您建议的类似:

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 函数开始常见任务是个好主意。