Java中Comparable.compareTo的返回值意味着什么?


75

在Java中,return 0,return1和returning有什么区别?-1compareTo()


6
compareTo也可以返回-2或42。
Thilo 2010年

4
一定要尝试Javadoc。
user207421's

24
如果您难以记住(像我一样),我只是简单地将其想象成是一个数字减法运算,a-b如果a更大,则结果为正(+1),否则,如果b更大,则结果为负...如果它们是等于其0
st0le

Answers:


93

官方定义

Comparable.compareTo(T)的参考文档中:

将此对象与指定对象进行比较。当此对象小于,等于或大于指定的对象时,返回负整数,零或正整数。

实现者必须确保所有x和y的sgn(x.compareTo(y))== -sgn(y.compareTo(x))。(这意味着x.compareTo(y)必须抛出异常,而y.compareTo(x)则抛出异常。)

实现者还必须确保该关系是可传递的:(x.compareTo(y)> 0 && y.compareTo(z)> 0)意味着x.compareTo(z)> 0。

最后,实现者必须确保对于所有z,x.compareTo(y)== 0意味着sgn(x.compareTo(z))== sgn(y.compareTo(z))。

强烈建议(但并非严格要求(x.compareTo(y)== 0)==(x.equals(y))。一般而言,任何实现Comparable接口且违反此条件的类都应明确指出这一事实。推荐的语言是“注意:此类具有与等式不一致的自然顺序”。

在前面的描述中,符号sgn(expression)表示数学符号函数,该函数定义为根据表达式的值为负,零还是正返回-1、0或1中的一个。

我的版本

简而言之:

this.compareTo(that)

退货

  • 一个负整数,如果this <that
  • 如果这==那是0
  • 一个正整数,如果this> that

该方法的实现确定< >and的实际语义====从Java的对象身份运算符的意义上来说,我并不是说)

例子

"abc".compareTo("def")

将产生小于0的值,如abc之前的字母顺序def

Integer.valueOf(2).compareTo(Integer.valueOf(1))

将产生大于0的值,因为2大于1。

一些其他要点

注意:对于实现Comparable的类,在Javadocs中声明其compareTo()方法的语义是一种很好的做法。

注意:您应该阅读以下至少一项:

  • Sun Java教程中“收集跟踪”的“对象排序”部分
  • Joshua Bloch撰写的有效Java,特别是第12项: 考虑实现Comparable
  • Maurice Naftalin和Philip Wadler撰写的Java泛型和集合,第3.1章:可比

警告:你不应该依靠的compareTo存在的返回值-101。你应该总是测试x < 0x == 0x > 0分别。


请记住,在他们谈论的文档中sgn(),不是直接的-1和1。您应该将其添加到简短版本中。
科林·赫伯特

我知道。我更喜欢真实的语言,而不是数学的庞然大物(男孩很高兴您不能拒绝评论:-)),所以我分别写了-1(或更小)1(或更大)
肖恩·帕特里克·弗洛伊德

1
有趣的是,官方文档在任何时候都没有说负整数实际上意味着这个<that。他们只是说有三个不同的返回值:负整数,零和正整数。其中一个表示this <that,一个表示this> that并且一个表示this == that。这些文档在任何时候都没有指定-实际上,您可以说,作者努力写出这些细节并将其保留。
OR Mapper

@ORMapper我不同意。“当此对象小于,等于或大于指定的对象时,返回负整数,零或正整数。” “按此对象的状态”部分将整数映射到关系。
肖恩·帕特里克·弗洛伊德

1
@kojow我还没有遇到过这样的实现,但是合同明确规定:“由于该对象小于,等于或大于指定的对象,所以返回负整数,零或正整数。”
肖恩·帕特里克·弗洛伊德

51

我用这个助记符:

a.compareTo(b) < 0 // a < b

a.compareTo(b) > 0 // a > b

a.compareTo(b) == 0 // a == b

您保留符号并始终将的结果compareTo()与0进行比较


1
太棒了!
mvorisek

我使用此仅数字版本容易记住:a.compareTo(b) = a - b
卧虎藏龙的小猫

@CrouchingKittena-b绝对不能在真实代码中的compareTo()实现中使用,因为它可能(并且将会)溢出。
克莱门特·切林

29

简而言之:(搜索您的情况)

  • 1 .compareTo(0)(返回1
  • 1 .compareTo(1)(返回0
  • 0 .comapreTo(1)(返回-1

2
很好的答案,可以快速参考。
Juzer Ali 2016年

5

例如,如果我们要比较“ a”和“ b”,即(“ a” == this)

  1. 如果a <b为负整数
  2. 如果a == b
  3. 如果a> b为正整数

3

它可用于排序,0表示“等于”,而-1表示“较少”和“更多(更大)”。

任何小于0的返回值都意味着左操作数较小,而如果值大于0,则左操作数较大。


2
它是负数,正数和0,而不仅仅是-1、1和0
Colin Hebert

Colin,有-1、0和1有问题。是的,虽然一些比较器仅返回这些值之一,但其他比较器可以返回任何值,其中负数表示左操作数较小,零表示两个操作数相等,而正数表示左操作数较大。在Java之外,这就像strcmp()C语言一样。
米哈尔尼克拉斯

2
int x = thisObject.compareTo(anotherObject);

compareTo()方法返回一个具有以下特征的int:

  • If thisObject < anotherObject
  • If thisObject == anotherObject
  • If thisObject > anotherObject

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.