手动计算字符串compareTo字符串的输出

时间:2016-04-26 07:45:47

标签: java string compareto

我正在尝试查看如何在比较字符串时手动计算输出,就像我正在练习的过去论文中提出的问题一样。

据我所知,如果字符串按字典顺序(根据unicode)在参数字符串之前,结果为负,如果跟在它之后则为正,如果它们相等则为零。我不知道如何计算价值(超出标志)。

我有代码给出输出1,-1,-3,3。我知道为什么每个都是正面或负面但不是为什么它是1或3。

public class CompareToPractice {
    public static void main(String[] args) {
        String str1 = "bode";
        String str2 = "bod";
        String str3 = "bodge";
        String str4 = "bog";

        int result1 = str1.compareTo(str2);
        System.out.println(result1);
        int result2 = str2.compareTo(str1);
        System.out.println(result2);
        int result3 = str3.compareTo(str4);
        System.out.println(result3);
        int result4 = str4.compareTo(str3);
        System.out.println(result4);
    }
}

谢谢

3 个答案:

答案 0 :(得分:5)

它是人物之间的差异' d'并且' e' (ascii差异)。

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

从行if (c1 != c2)可以看出。如果2个字符不相等,则结果将是这2个值的减法。

在你的情况下str3.compareTo(str4)是&#34; bodge&#34; - &#34; bog&#34;。
所以&#39; d&#39;&#39; g&#39; (ASCII值:100 - 103 = -3)

答案 1 :(得分:2)

  

我没有看到如何计算价值(超出标志)。

“超出标志”的价值无关紧要。它没有传达正常应用程序可以使用 1 的信息。这仅仅是一个实现细节:一个针对速度优化的算法的偶然伪像。

如果您真的想知道,请查看source code

1 - 我想你在理论上可以构建一个使用它的程序。但我无法想象这样一个程序会解决的问题......除了循环问题,例如调查compareTo的统计特性!

答案 2 :(得分:2)

compareTo的文档清楚地定义了在何种情况下计算结果以及如何计算结果。

  

这是词典排序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,这两个字符串是两个字符串的有效索引,或者它们的长度不同,或两者都有。如果它们在一个或多个索引位置具有不同的字符,则令k为最小的索引;然后,通过使用&lt;来确定位置k处的字符具有较小值的字符串。运算符,按字典顺序排在另一个字符串之前。在这种情况下,compareTo返回两个字符串中位置k处两个字符值的差值 - 即值:

     

this.charAt(k)-anotherString.charAt(k)

     

如果没有它们不同的索引位置,则更短   字符串按字典顺序排在较长的字符串之前。在这种情况下,   compareTo返回字符串长度的差异 - 即   是,值:

     

this.length()-anotherString.length()

Bandi Kishore的回答也解释了ASCII差异计算:https://stackoverflow.com/a/36858565/904375