Java 原语long的有效compareTo()

Java 原语long的有效compareTo(),java,compareto,Java,Compareto,在处理排序列表时,我需要实现一个compareTo()函数来处理原始长值 我不是在寻找明显的天真实现,而是想知道是否有一个优雅的单行程序代码可以做到这一点(不创建新的Long(值)) 也许是这样的: @Override public int compareTo(MyClass that) { return (int) ((value - that.value) >>> 32); } 有人能验证这一点和/或建议另一种实现吗?一个线性代码: int res = Long.

在处理排序列表时,我需要实现一个compareTo()函数来处理原始长值

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

也许是这样的:

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

有人能验证这一点和/或建议另一种实现吗?

一个线性代码:

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

您的代码无法正确处理所有值,请尝试使用Integer.MIN\u VALUE-Integer.MAX\u VALUE,您将得到+1

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

(1 - 0) >>> 32
1 >>> 32
0
一般来说,我不确定在没有分支指令的情况下是否可以比较long,因为两个long的差异可能不适合没有溢出的long,这将改变差异的符号


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

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

public static int signum(long i) {
  return (int) ((i >> 63) | (-i >>> 63));
}
我不能认为这是解决方案的功劳,它的实施:

根据您的示例,我将其用作:

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

正如前面提到的一条评论,从用于常见任务的内置JDK函数开始是一个好主意。

这基本上就是转换为
(x
对吗?我想知道是否有什么东西不需要两个内部if-then调用,假设它会更有效。@traveh我认为正确性高于性能。此外,JDK可能已经对该方法进行了优化。@E_net4我大体上同意,但为了论证起见,让我们假设这是一种性能至关重要的特殊情况。我不确定将JDK实现称为naive是否公平。就我个人而言,我想不出一个更有效的正确实现。+1-一般来说,对常见任务使用内置的JDK函数,因为它们更可能是内部化的。