2016-04-26 70 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的答案真的爲我澄清了。 –