compareTo是如何工作的?

12
我知道compareTo会根据字符串的相关性返回负数或正数,但是为什么会这样呢?
我了解到compareTo会根据字符串的相关性返回负数或正数,但是为什么呢?
public class Test {
    public static void main(String[] args) {
        String y = "ab2";
        if(y.compareTo("ac3") == -1) {
            System.out.println("Test");
        }
    }
}

是真的

public class Test {
    public static void main(String[] args) {
        String y = "ab2";
        if(y.compareTo("ab3") == -1) {
            System.out.println("Test");
        }
    }
}

也是真的吗?


3
不要使用 ==-1,而是使用 <0。请注意,"ab2".compareTo("cb2") 返回 -2,就像 "ab2".compareTo("ab4") 一样(结果是字符串中不同索引处的字符在 Unicode 表中的差异——如果字符串长度相同)。 - Pshemo
使用compareTo进行比较不使用相关性:相关性是对称的,而compareTo是(或者至少应该是)反对称的,至少在这样一个意义上: sign(a.compareTo(b)) = -sign(b.compareTo(a)) - Andy Turner
3个回答

18

Comparable.compareTo(o) 的一般契约是:

  • 如果此对象大于另一个对象,则返回正整数。
  • 如果此对象小于另一个对象,则返回负整数。
  • 如果此对象等于另一个对象,则返回0。

在您的示例中,"ab2".compareTo("ac3") == -1"ab2".compareTo("ab3") == -1 仅表示 "ab2" 低于 "ac3""ab3"。您不能仅凭这些示例得出关于"ac3""ab3"的任何结论。

这个结果是预期的,因为字母表中b位于c之前(所以"ab2" < "ac3"),而2在3之前(所以"ab2" < "ab3"):Java按字典顺序对字符串进行排序(lexicographically)


重要的是要知道,即使最后一个整数表明ab7应该比ac2大,但"ab7"仍然比"ac2"小,因为compareTo()按照字典顺序工作如下:如果字符串不同,则取最小索引,在我们的例子中"ab7"和"ac2"的最小索引是1(即使索引2也不同!),在该索引处查看字典顺序(b小于c),因此"ab7"比"ac2"小。 - prashanth

1
对于字符串,compareTo方法返回-1,如果第一个字符串(调用该方法的字符串)在字典序中排在第二个字符串(方法参数)之前。"ab2"在"ab3"之前(因为前两个字符相等且2在3之前),也在"ac3"之前(因为第一个字符相等且b在c之前),因此两个比较都返回-1。

1
更准确地说:对于字符串,compareTo返回一个负数,如果第一个字符串在第二个字符串之前。 - Tunaki

1

compareTo()函数是用于比较两个字符串的字母顺序的。在你测试的两个字符串中,有一个字符串按照字母顺序“排在”另一个字符串之前。换句话说:

  • ab2 < ac3 (因为b < c)
  • ab2 < ab3 (因为2 < 3)

顺便提一下,在if语句中最好使用"< 0"而不是"== -1",因为compareTo规范指出该函数返回一个负数,而不是具体的"-1"


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