【问题标题】:What's the purpose of expressing the relation of objects with integers?用整数表达对象关系的目的是什么?
【发布时间】:2017-04-04 02:43:15
【问题描述】:

在比较对象时,通常会得到一个除 -1、0、1 以外的整数。

例如(在 Java 中)

Byte a = 10;
Byte b = 20;
System.out.println(a.compareTo(b)); // -10

在实践中是否有任何算法、数据结构利用了比较模型的这一属性?

或者换句话说:为什么任何数字 > 1 或

编辑:对不起。我知道您如何将这个问题误解为 Java 问题。我的错。我将标签从“java”更改为“语言不可知论”。

【问题讨论】:

  • 您能详细说明一下吗?我不明白你在问什么。您是在问 compareTo() 方法的用途吗?如果是这样:将对象相互比较,特别是在对它们进行排序时。
  • 他基本上是在问为什么最初将 compareTo 设计为返回 int 而不是三元枚举/标志/int 值/布尔值的方法。或者换句话说:为什么任何数字 > 1 或
  • 好吧,你刚刚找到了一个。查看 Byte.compareTo() 的实现。如果它必须返回 -1 或 1 会更复杂。

标签: algorithm sorting data-structures language-agnostic comparison


【解决方案1】:

Comparable 对象的合约指定compareTo() 返回的值是:

负整数、零或正整数,因为此对象小于、等于或大于指定对象。

上面的定义简化了比较,我们只需要使用通常的比较运算符来测试返回值是否为零。例如,要检查对象a 是否大于或等于对象b,我们可以这样写:

a.compareTo(b) >= 0

此外,这比简单地返回-110 更灵活,因为它允许每个实现返回一个带有附加信息的值。例如,StringcompareTo() 返回:

两个字符串中k位置的两个字符值之差——即值:

this.charAt(k) - anotherString.charAt(k)

如果它们没有不同的索引位置,则较短的字符串按字典顺序位于较长的字符串之前。在这种情况下,compareTo 返回字符串长度的差值——即值:

this.length() - anotherString.length()

【讨论】:

  • 但是我可以用这些附加信息做什么?
  • 这取决于问题...对于String示例,您可以知道差异有多大
【解决方案2】:

没有算法会利用这个“属性”,因为你不能依赖返回的确切值。

您拥有的唯一保证是<0=0>0,因为这是Comparable.compareTo() 定义的合约:

返回一个负整数、零或正整数,因为此对象小于、等于或大于指定的对象。

Byte 实现不再具体:

如果此 Byte 等于参数 Byte,则返回 值 0;如果此 Byte 在数值上小于参数 Byte,则 值小于 0;如果此 Byte 在数值上大于参数 Byte(有符号比较),则 值大于 0

任何其他内容都是任意的,如有更改,恕不另行通知。


为了澄清,返回值被定义为<0=0>0 而不是-10+1,以方便实现,而不是作为向调用者提供额外信息的一种方式。

例如,Byte.compareTo(Byte anotherByte) 被实现为使用以下简单代码返回一个介于 -255 和 255(含)之间的数字:

return this.value - anotherByte.value;

替代方案是这样的代码:

return this.value < anotherByte.value ? -1 : this.value > anotherByte.value ? 1 : 0;

由于调用者测试返回值x &lt; 0 而不是x == -1 一样容易,因此允许更广泛的返回值提供更清洁、更优化的代码。

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2019-01-20
    • 2015-02-15
    相关资源
    最近更新 更多