原始long的有效compareTo()

时间:2015-06-28 14:30:45

标签: java compareto

在排序列表上工作我得到了一个点,我需要为原始long值实现compareTo()函数。

没有寻找明显天真的实现,但是想知道是否有一个优雅的单行代码(没有创建新的Long(值))。

也许是这样的:

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

任何人都可以验证是否有效和/或建议其他实施?

3 个答案:

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