2016-04-26 75 views
1

我想看看如何在比较字符串时如何手动计算输出,就像我在练习过去的论文中提到的那样。手动计算输出字符串compareTo字符串

我知道如果字符串按字典顺序(根据unicode)在参数字符串前面,那么结果是否定的,如果它跟在后面则为正数,如果它们相等则为零。我看不出如何计算值(超出符号)。

我已经赋予输出1,-1,-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); 
    } 
} 

谢谢

+0

根据对于合同,只有标志很重要。如果您对实际的实现感到好奇,只需查看[source](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang /String.java#String.compareTo%28java.lang.String%29)。 – shmosel

+0

'contract'shmosel是什么意思? –

+0

“Comparable”接口的文档。 – shmosel

回答

5

它是字符'd'和'e'之间的差异(ascii difference)。

这是的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)是“bodge” - “bog”。
所以 'd' - 'G'(ASCII值:100 - 103 = -3)

+0

所以它是前两个字符的ASCII值不匹配。我刚刚运行了代码,但想确认“bodge” - “bog”的结果与“bod”vs“bog”相同。他们都给我-3。 谢谢你Bandi –

2

我没有看到如何计算值(超出符号)。

“超越符号”的值是无关紧要的。它没有传达任何正常应用程序可以使用的信息。它仅仅是一个实现细节:一种为速度优化的算法的偶然伪像。

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


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

+0

在我的问题中,我说过“我在练习的过去的论文中出现过类似的问题”。有几个(10)个问题每个都给出了字符串,并且“给出了每个表达式的价值”。每个表达式都有一个标记。我认为他们在价值之后,而不仅仅是一个标志。 你在考试中必须做的事情往往与现实生活无关:-) –

+0

好。但这些考试题目并不要求你解释'String.compareTo'的值(没有显示你的代码)并解释他们的意思。实际上,这就是你在问题中提出的问题。相反,这些考试题要求你计算一下>>给出的代码片段将要做什么。 –

+0

谢谢。但是,如果不理解价值是什么,代码将如何实现,我们无法回答这个问题。这是一个笔和纸的问题;没有IDE使用。 –

2

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

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

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

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

this.length()-anotherString.length()

而且半狄纪的回答解释了ASCII差值计算:https://stackoverflow.com/a/36858565/904375

+0

这个文档对我来说很难理解,而Bandi的答案真的为我澄清了。 –