2017-07-15 37 views
-4

在java中如果()方法是行不通的

s1 = "d"; 
s2 = "D" 

System.out.println(s1.compareTo(s2)); 

它會給輸出32始終不管他們是相同的,即一個是資金,一個是小,你用什麼字母。

這是爲什麼?

+4

請仔細閱讀相關的[ javadoc](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-),然後再問這樣的問題。另見['compareToIgnoreCase'](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareToIgnoreCase-java.lang.String-) – janos

+0

[compareTo method java](https://stackoverflow.com/questions/10017381/compareto-method-java) – JRG

+0

我不認爲你測試了所有109591字母,即使那些可以放入大寫和小寫對稱對的字母。 '「θ」.compareTo(「Θ」)== -60' theta:[uppercase](http://www.fileformat.info/info/unicode/char/03f4/index.htm)和[小寫字母](http ://www.fileformat.info/info/unicode/char/03b8/index.htm)。除了好奇心之外,大部分答案都指出方法的定義返回值是0並且不爲零。 –

回答

1

Here'scompareTo方法的javadoc的,這就是它說:

比較兩個字符串按字典順序。該比較基於字符串中每個字符的統一碼值 。由此String對象表示的字符序列 按字典順序與參數字符串表示的 字符序列進行比較。如果此字符串對象按照字典順序排列在參數字符串 之前,結果爲 負整數。如果此字符串 對象按字典順序跟隨參數字符串,則結果爲正整數。如果字符串相等,結果爲 ;當 等於(Object)方法將返回true時,compareTo返回0。

因此,它基於字符的Unicode值進行比較。因爲Dd是不同的字符,所以它們具有不同的unicode值,因此比較不會返回0.另外,根據this Unicode chart,大寫字母的unicode值小於小寫字母,因此您會得到正值。

如果你想區分大小寫比較,那麼你應該使用compareToIgnoreCase

1
String s1 = "d"; // Ascii value for 'd' 100 
    String s2 = "D"; //Ascii value for 'D' 68 

    System.out.println(s1.compareTo(s2)); 

因此32(100-68)是輸出

1

Comparable<T>compareTo應實行這樣的:

  • 如果this比參數大,返回正數
  • 如果this是等於參數,返回0
  • 如果this小於參數,則返回負數。

由此,我們可以看出,一個容易實現compareTo方法比較整數是簡單地從this減去參數。那麼,角色可以表示爲整數,不是嗎?

您正在使用的compareTo方法的實現可能會將this和該參數轉換爲其Unicode值,並從前者中減去後者。

讓我解釋爲什麼你每次得到32。

「a」的Unicode值爲97,「A」的Unicode值爲65.「b」爲98,「B」爲66 ...等等。

現在我們可以看到,在統一的差異小寫字母之間的價值和它對應的大寫總是32.既然compareTo從另一箇中減去一個值,你總能得到32

+1

比較基於每個字符的Unicode值。不是ASCII值。 – saka1029

+0

@ saka1029對於拉丁字母,值是相同的...編輯 – Sweeper