【问题标题】:How come Java's Integer class does not have compare() method?为什么 Java 的 Integer 类没有 compare() 方法?
【发布时间】:2011-08-02 18:53:13
【问题描述】:

Double 有 Double.compare 用于比较两个双精度原语。为什么 Integer 没有一个?

我知道要编写一些微不足道的代码,但出于好奇而询问。

编辑:我意识到 Integer 和 Double 都有 compareTo。但是使用 compareTo 需要将 int 原语装箱到 Integer 对象中,这具有相当高的成本。此外,inta > intb 与 compare(inta, intb) 不同,后者返回 +1、0 或 -1,而前者是 true/false ....

【问题讨论】:

  • 它没有compare(int a, int b) 方法,但是你可以使用:new Integer(a).compareTo(b)
  • @ty1824 需要将原语装箱到对象中...
  • 我明白了。另外,从您的编辑中,您需要从这个答案中得到什么?您需要 +1、0 还是 -1?只使用 +N、0 或 -N 会好吗?如果是这样,您可以简单地从前一个整数中减去第二个整数。 int result = first - second; 如果你想要的只是 +1、0 或 -1,你就可以得到结果的大小。 result /= Math.abs(result)
  • 拳击没有“相当高的成本”。

标签: java


【解决方案1】:

这是 Java 7 将解决的疏忽

http://download.oracle.com/javase/7/docs/api/java/lang/Integer.html#compare%28int,%20int%29

公共静态int比较(int x, int y)

比较两个 int 值。返回的值与返回的值相同:

Integer.valueOf(x).compareTo(Integer.valueOf(y))

参数: x - 要比较的第一个 int y - 要比较的第二个 int 回报: 如果 x == y,则值为 0;如果 x y,则值大于 0 自从: 1.7

【讨论】:

  • 我不会说疏忽,更多的是故意的遗漏,因为它对于整数来说是微不足道的,而不是浮点数。他们可能刚刚重新考虑了 7 - 但是它包含在其中!
【解决方案2】:

Double 中的compare 与以下效果相同:

new Double(d1).compareTo(new Double(d2))

这意味着需要考虑NaN+0-0(引用compareTo() 的文档):

  • 此方法认为 Double.NaN 等于自身,并且 大于所有其他双精度值(包括 Double.POSITIVE_INFINITY)。
  • 此方法认为0.0d大于-0.0d。

由于 Integer 没有NaN,并且+0-0 都将被视为只是0,因此功能上不需要这种方法。

【讨论】:

  • 我认为这可能是唯一真正提供正确信息的答案。
  • 是的,不开玩笑。我很惊讶有多少人盲目地相信 Double.compare 会处理浮点不精确问题。
【解决方案3】:

以这种方式比较整数是微不足道的,比较双精度数实际上比最初看起来要复杂得多。您必须处理诸如错误值之类的事情,以及诸如 NaN 之类的不太明显的情况。

详情请见this question

不管怎样,从 Java 7 开始,您也将拥有这样的 int 方法!

【讨论】:

  • 这可能是微不足道的,但老实说,我总是忘记哪个应该是 1 或者哪个应该是 -1。这并不是说我需要很长时间才能记住,但是在我看来,仅仅因为它微不足道而将逻辑(这确实有资格)并将其放在十亿个位置的想法是一个糟糕的决定。
【解决方案4】:

浮点值不一定可以二进制比较,因为浮点表示不精确,因此需要一个 compare() 运算符来比较两个浮点值,本质上确保它们之间的差异不大于 a (小)误差值。整数可以进行二进制比较,因此可以使用相等运算符。

【讨论】:

  • +1 但请记住,相等操作必须使用int,而不是Integer
  • 可以用一个简单的< 操作符比较浮点值,你只需要知道你在做什么。另外,Double.compare 方法并没有使用这个比较有细微差别“相等”,只是因为它不需要。
【解决方案5】:

可能是因为compare的操作比较简单(但还是有很多人搞错了)。和double比起来,确实是。

我也想内置这个方法,让其他人编写更简单的代码。但只要甲骨文不认为这是一个问题,我们就必须依靠谷歌的 Guava 或类似的库来提供缺失的部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2016-10-20
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多