2014-02-24 101 views
2

我是初学者在Java中,可能我问的东西明显,但无论如何。Java:比较字符串与“ - ”(破折号)

根据java.lang.String中的compareTo()方法的描述:

比较是基于所述字符串的每个字符的Unicode值。

我比较字符串

public void compareString() { 
    String str1 = "test-2014"; 
    String str2 = "test195519-9022c72bc161"; 
    String str3 = "test200101-ee4d99b1492c"; 
    String str4 = "test212941-884e3f03fe1e"; 

    System.out.println(str1.compareTo(str2)); 
    System.out.println(str1.compareTo(str3)); 
    System.out.println(str1.compareTo(str4)); 
} 
------------ OUTPUT ----------- 
-4 
-5 
-5 

我期待输出将在所有三种情况相同,因为在任何情况下第五字符的Unicode值(1,2,2)比第五更大字符“str1”( - )。

你能解释一下为什么会发生?

认为

+0

看一看ASCII表格,看看有多少地方与其他角色分开。 – AntonH

回答

1

您希望以下

我期待输出将在所有三种情况相同,因为第五个字符的在任何情况下 Unicode值(1,2,2)大于 “str1”( - )中的第五个字符。

这种期望是错误的。 -的unicode值比其他值小。

运行该测试

System.out.println((int) '-'); 
System.out.println((int) '1'); 
System.out.println((int) '2'); 

它将打印

45 
49 
50 

45比49更小,所以该方法将返回一个负值。 As the javadoc says

如果参数字符串等于此字符串,则值为0; a值 如果此字符串按字典顺序小于字符串 参数,则小于0;,并且如果此字符串按照字典顺序大于字符串参数 ,则该值大于0。

对于参考,String#compareTo(String)在甲骨文的Java执行7

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; // important!!!! 
     } 
     k++; 
    } 
    return len1 - len2; 
} 
4

返回哪个负数不重要。这里唯一重要的信息是compareTo返回的标志。它返回-1,-4,-5-1000000并不重要。唯一可以得出结论的是str1比其他每个字符串都要少。

the Javadocs for the compareTo method in Comparable

比较与指定对象此对象为顺序。返回负整数,零或正整数,因为此对象小于,等于或大于指定的对象。

+1

应该注意的是,一些实现可能偶然返回一个表达差异的有用值(即对这个问题的另一个答案),但这不是规范的一部分,也不是真正的依赖。 – iamnotmaynard

0

无处没有指出compareTo()应该返回不匹配的第一个字符的索引。这是您的错误假设。唯一保证的结果是它的返回值可能是负数,正数或零,这取决于两个字符串的字典对比。

在这三种可能性的每一种中,返回的实际数量(-5与-1与-3495582之间)取决于实现(实现可以随意返回,只要它是负数)你不应该对此做任何进一步的假设。

+1

我不认为OP实际上做出了这个假设。 – iamnotmaynard