CompareTo()实际返回什么



Java中的compareTo()方法返回一个更大/相等/小于0的值,我知道这一点。但是,价值本身是我的问题。当compareTo()返回时2或4之间有什么区别。查看下面的代码

String s1="hello";  
String s2="hello";  
String s3="meklo";  
String s4="hemlo";  
System.out.println(s1.compareTo(s2));     // 0
System.out.println(s1.compareTo(s3));     // -5
System.out.println(s1.compareTo(s4));     // -1

为什么最后两个命令为-5和-1?

这是词典顺序的定义。如果两个字符串是不同的,那么它们在某些索引上具有不同的字符,这是两个字符串的有效索引,或者它们的长度不同,或者两者都不同。如果他们在一个或多个索引位置上具有不同的字符,请k为最小的索引;然后通过使用&lt确定的位置k的字符的字符串具有较小的值;操作员,词典在另一个字符串之前。在这种情况下,CompareTo返回两个字符串中位置k处两个字符值的差 - 即值:

this.charat(k)-AnothersTring.Charat(k)

如果没有不同的索引位置,则较短的字符串词典在较长的字符串之前。在这种情况下,CompareTo返回字符串长度的差异 - 即值:

this.length()-AnotherString.length()

compareTo()返回了两个字符串中第一个 trimbate 字符的差。如果找不到不匹配,并且一个字符串比其他字符串短,则返回长度差

"hello".compareTo("meklo") = 'h' - 'm'  = -5
 ^                 ^
and 
"hello".compareTo("hemlo") = 'l' - 'm'  = -1
   ^                 ^

作为旁注:非零值主要被视为条件语句内部的true。因此,compareTo可以简单地返回这些非零值,而不是将它们处理到1小优化)中。

如果您仔细查看String#compareTo(String)的源代码,则可以看到确切的结果是模棱两可的。

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;
    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}

在大多数情况下(即两个字符串字符的差异),它将返回第一个不同字符的char值的整数差异。否则,它将返回两个字符串的长度差。

= 0> 0< 0之外的返回值的解释在实践中不必担心,因为如果保留了Comparable<T>#compareTo(T)的合同,则允许实施任何时间更改:

将此对象与指定的对象进行比较。返回一个负整数,零或正整数,因为该对象小于,等于或大于指定的对象。

来源:https://docs.oracle.com/javase/8/docs/api/java/java/lang/comparable.html#compareto-t-t-

确切的值无关紧要 - Comparable(以及Comparator)接口都关心的所有内容是值是负,零还是正面。

这是为了使事物用于实现接口。实施它时,您可以选择返回基本-1、0或1(如果比较依赖于评估某些条件,这是通常的),或者如果它更适合您,则可以使用任何任意负值或正值 - 例如您可以通过返回this.i - other.i进行比较两个整数。


在您特定给定的例子中,我的猜测是:

  • -1是第三个字母的代码点的差异: 'l' - 'm' == -1
  • -5在第一个字母的代码点中是差异: 'h' - 'm' == -5

,但重要的部分是您不得依靠它是那样的 - 这是一个实施细节,根据Comparable的合同,任何负值都应相同("小于")。

最新更新