将Java Strings与`compareTo()`方法进行比较

时间:2014-05-19 16:37:29

标签: java regex string compare

作为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.

  

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

2 个答案:

答案 0 :(得分:1)

以下是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;
}
基于此,我相信你是对的。返回给定索引处的第一对不匹配字符之间的差异,或返回长度差异。

答案 1 :(得分:1)

  

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

这取决于你的意思准确。

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

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

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

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

  • 忽略这些漏洞,看起来它是(至少)@ user3580294找到的compareTo实施行为的充分模型。

String.compareTo的真实规范由javadocs给出。它是明确的,也是明确的。换句话说,没有必要重申...... IMO。