【问题标题】:Comparing Java Strings with the `compareTo()` method使用 `compareTo()` 方法比较 Java 字符串
【发布时间】:2014-05-19 16:37:28
【问题描述】:

作为compareTo() 方法进行的字符串比较的概括:

对于两个给定的字母:

  • 两个字母匹配值,结果值为0。
  • 如果给定字母在另一个给定字母之前出现,则两者的比较值为负。
  • 如果给定字母的位置在另一个字母之后,则两者的比较值为正。

可以这样认为:

在26个英文字母的顺序中,“A”可以被认为是索引1,“B”是索引2:

因此,A = 1; B = 2。

A - B = -1。

要达到 A 的值,B 必须减 1,或者 B - 1 = 1 = A。

例如:

  int result;
  
  String letterA = "a";
  String letterB = "b";
  
  result = letterA.compareTo(letterB);
  System.out.println("The difference between the letter \"a\" and the letter \"b\" will be equivalent to: " + result);

考虑字符串时:

其字符串字符索引沿其各自字符串的前两个字符的字母索引的差异将是String.compareTo(String)方法返回的值(其中“String”表示一个广义字符串值)。

例如:

  int result;
  
  String stringBA = "ba";
  String stringBD = "bd";
  
  result = stringBA.compareTo(stringBD);
  System.out.println("The difference between string \"ba\" and string \"bd\" will be equivalent to: " + result);

比较将评估为 -3,因为在方法中最终比较的字母之间的差异是字符“a”和“d”,它们的字母索引分别为 1 和 4。

可以这样说:要达到A的值,D必须减3,或者D - 3 = A。

这可以被认为是准确的吗?

【问题讨论】:

  • 有人知道如何提交 wiki 帖子吗?当我尝试时,我无法发布这个。我觉得这真的可以帮助新用户理解compareTo(String) 方法。

标签: java regex string compare


【解决方案1】:

这可以被认为是准确的吗?

这取决于你所说的准确是什么意思。

  • 作为一个规范,它是不完整的:

    • 它只处理“字母”字符和包含“字母”的字符串。相比之下,String.compareTo 适用于任何代码点序列。

    • 它不处理长度不等且公共部分具有相同字符子序列的字符串。

  • 忽略规范中的漏洞,这是一个过度规范。 String.compareTo 的 javadoc 没有准确指定返回值是什么。它只是说它是零、负数还是正数。

  • 忽略这些漏洞,对于@user3580294 发现的(至少)compareTo 的实现,它看起来是一个足够的模型。

String.compareTo 的真正规范由javadocs 给出。它是明确的,也是确定的。换句话说,无需重述……IMO。

【讨论】:

    【解决方案2】:

    这是String#compareTo()的来源:

    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;
    }
    

    基于此,我相信你是对的。要么返回给定索引处第一对不匹配字符之间的差异,要么返回长度差异。

    【讨论】:

    • 太棒了。我相当肯定。我想将其发布为 wiki 帖子,因为我觉得它可以帮助许多新程序员理解 compareTo(String) 方法。我知道,就我个人而言,这对我来说是一个困惑点(由于缺乏明确的解释)。但是,我不知道如何发布 wiki/self-answer 帖子。
    • @alx 在预览之前,帖子底部有一个社区 wiki 复选框。您只能将自己的问题/答案标记为社区 wiki。
    • @LuiggiMendoza 啊,之前没有注意到。不确定我是否应该根据 StephenC 的回答将其标记为 wiki,但我会记住这一点以备将来使用。谢谢!
    • @LuiggiMendoza 是的,但它说我的回答不符合社区标准?
    • 嗨,有人能解释一下这行代码吗:int len2 = anotherString.value.length;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2011-02-13
    相关资源
    最近更新 更多