Java 手动计算从字符串比较器到字符串的输出

Java 手动计算从字符串比较器到字符串的输出,java,string,compareto,Java,String,Compareto,我试图了解如何在比较字符串时手动计算输出,就像我在练习的以前的论文中提出的问题一样 我知道,如果字符串按字典顺序(根据unicode)在参数字符串之前,则结果为负;如果参数字符串之后,则结果为正;如果参数字符串相等,则结果为零。我不知道如何计算这个值(符号之外) 我有一个代码,它给出了输出1,-1,-3,3。我明白为什么每个都是正的或负的,但不明白为什么是1或3 public class CompareToPractice { public static void main(String

我试图了解如何在比较字符串时手动计算输出,就像我在练习的以前的论文中提出的问题一样

我知道,如果字符串按字典顺序(根据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);
    }
}

谢谢

这是字符“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;
}
public int compareTo(字符串另一个字符串){
int len1=value.length;
int len2=另一个string.value.length;
int lim=Math.min(len1,len2);
字符v1[]=值;
char v2[]=另一个string.value;
int k=0;
while(k
正如您从第
行看到的,如果(c1!=c2)
。如果两个字符不相等,则结果将是这两个值的减法。

在你的例子中,str3.compareTo(str4)
是“bodge”-“bog”

因此'd'-'g'(ASCII值:100-103=-3)这是字符'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;
}
public int compareTo(字符串另一个字符串){
int len1=value.length;
int len2=另一个string.value.length;
int lim=Math.min(len1,len2);
字符v1[]=值;
char v2[]=另一个string.value;
int k=0;
while(k
正如您从第
行看到的,如果(c1!=c2)
。如果两个字符不相等,则结果将是这两个值的减法。

在你的例子中,str3.compareTo(str4)
是“bodge”-“bog”
So'd'-'g'(ASCII值:100-103=-3)

我不知道如何计算这个值(符号之外)

“超出符号”的值是不相关的。它不传递普通应用程序可以使用1的任何信息。这仅仅是一个实现细节:一个为速度而优化的算法的偶然产物

如果你真的想知道的话,看看下面的例子


我想你可以在理论上构造一个使用它的程序。但我想不出这样一个计划能解决什么问题。。。除了循环问题之外,例如调查
的统计特性比较到

我不知道如何计算这个值(符号之外)

“超出符号”的值是不相关的。它不传递普通应用程序可以使用1的任何信息。这仅仅是一个实现细节:一个为速度而优化的算法的偶然产物

如果你真的想知道的话,看看下面的例子



我想你可以在理论上构造一个使用它的程序。但我想不出这样一个计划能解决什么问题。。。除了循环问题之外,例如调查
的统计特性比较到

compare to
的文档清楚地定义了在什么情况下计算结果以及如何计算结果

这是词典排序的定义。如果两个字符串不同,则要么它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,要么它们的长度不同,要么两者都不同。如果它们在一个或多个索引位置具有不同的字符,则k是此类索引的最小值;然后,使用<运算符确定其在位置k处的字符具有较小值的字符串按字典顺序位于另一个字符串之前。在本例中,compareTo返回两个字符串中位置k处两个字符值的差值,即:

this.charAt(k)-另一个string.charAt(k)

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

this.length()-另一个String.length()


Bandi Kishore的回答还解释了ASCII差异计算:

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

这是词典排序的定义。如果两个字符串不同,则要么它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,要么它们的长度不同,要么两者都不同。如果它们在一个或多个索引位置具有不同的字符,则k是此类索引的最小值;然后,使用<运算符确定其在位置k处的字符具有较小值的字符串按字典顺序位于另一个字符串之前。在本例中,compareTo返回两个字符串中位置k处两个字符值的差值,即:

this.charAt(k)-另一个string.charAt(k)

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

this.length()-另一个String.length()


Bandi Kishore的回答还解释了ASCII差异计算:

根据合同,只有符号才重要。如果您对实际实现感到好奇,只需看看。您所说的“合同”shmosel是什么意思?可比的
文档