2014-02-24 158 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