【问题标题】:How does compareTo work?compareTo 是如何工作的?
【发布时间】:2015-09-07 17:13:00
【问题描述】:

我知道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");
        }
    }
}

也是这样吗?

【问题讨论】:

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

标签: java equals comparable compareto


【解决方案1】:

Comparable.compareTo(o)的总合约是返回

  • 如果 this 大于另一个对象,则为正整数。
  • 如果它小于另一个对象,则为负整数。
  • 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"。
【解决方案2】:

compareTo for Strings 返回 -1,如果第一个 String(方法被调用)在第二个 String(方法的参数)之前按字典顺序。 "ab2" 在 "ab3" 之前(因为前两个字符相等,2 在 3 之前)和在 "ac3" 之前(因为第一个字符相等,b 在 c 之前),所以两个比较都返回 -1。

【讨论】:

  • 更准确地说:如果第一个字符串在第二个字符串之前,则字符串的 compareTo 返回负数
【解决方案3】:

compareTo() 比较两个字符串的字母顺序。你们两个测试都有一个按字母顺序排序的字符串“在”与它进行比较的字符串之前。换句话说:

  • ab2
  • ab2

顺便说一句,您应该在 if 语句中使用“compareTo 规范说该函数返回一个负数,而不是专门的“-1”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2020-01-27
    • 2018-02-21
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多