将长整型转换为整型,保留正数/负数/0。

5

我希望实现一个使用Longjava.util.Comparator

new Comparator<Long>() {
    public int compare(Long l1, Long l2) {
        // (*)
    }
}

我有一个使用运算符?:的解决方案:

return l1==l2 ? 0 : (l1>l2 ? 1 : -1);

但我想知道是否还有其他实现方法。

(我尝试使用return (int)(l1-l2),但这是不正确的。)


1
为什么你想要修改你的实现呢?它是正确的。 - dtech
1
return (int)Math.signum(l1-l2) 的翻译是什么? - assylias
@assylias,您现在正在将long转换为double,然后再将double转换回int。此外,该解决方案可能对所有long都不正确(例如,在2 ^ 60和2 ^ 60-1上返回0)。 - dtech
@dtech 显然不是很高效,但是是对"(我试图返回(int)(l1-l2),但是这是不正确的)"的回应。 - assylias
2个回答

12

这很容易 - Long 类本身提供了实现:

public int compare(Long l1, Long l2) {
    return l1.compareTo(l2);   
}

另一方面,在那个时候,我不确定为什么你需要自定义比较器...

编辑:如果你确实在比较long值,并且使用的是Java 1.7,则可以使用Long.compare(long, long)。否则,请继续使用当前的实现。


谢谢,这只是我真正问题的简化演示。但我刚发现,我需要比较的是long而不是Long,所以我仍然必须使用?: - Freewind
@FreeWind Java自1.6版本开始支持自动装箱,因此这并不重要。在方法签名中,long和Long可以互换使用。或者您可以使用new Long(long value) - dtech
你的回答仍然是这个问题中最好的 :) - Freewind

2

不,那是唯一有效的方式。这个话题已经讨论了很多次。当然,java.lang.Long 已经实现了一个 compareTo 函数,但它的实现与您的完全相同。


最终我仍然使用?:,但由于在这个问题中它是Long类型的,所以我必须选择JonSkeet的答案。谢谢! - Freewind

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接