对原始 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 函数开始常见任务是个好主意。
在处理排序列表时,我发现我需要为原始 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 函数开始常见任务是个好主意。