Java 快速導覽 - String 類別的 compareTo()

String 類別 (class) 有 compareTo() 方法 (method) ,逐字元比較原字串與 anotherString ,若無不同,也就是兩個字串中的每個字元都相同就回傳 0 ,若有不同則回傳長度差或第一個不同字元的 Unicode 差值

方法描述
int compareTo(String anotherString)逐字元比較原字串與 anotherString ,若無不同,也就是兩個字串中的每個字元都相同就回傳 0 ,若有不同則回傳長度差或第一個不同字元的 Unicode 差值


內文依據花生狼網友的指正於 2011, 8, 26 進行修改,重寫之範例說明,請參考關於 compareTo() 的補充範例說明


舉例如下
class ComparetoSDemo {
    public static void main(String[] args) {
        String a = "Imagination is more important than knowledge.";
        String b = "He who has hope has everything.";
        String c = "台上一分鐘,台下十年功。";
        
        System.out.println(a.compareTo(b));
        System.out.println(b.compareTo(a));
        System.out.println(c.compareTo(c));
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:ComparetoSDemo.java
    功能:示範物件導向的基本觀念 
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



中英文術語對照
類別class
方法method
字串string






5 則留言:

Dr4guitar 提到...

你寫錯了~!!!

Kaiching Chang 提到...

請指教

花生狼 提到...

很感謝您能分享您的知識,
但或許是因為被c語言的strcmp()所影響,
才會有
『比較原字串與 anotherString ,大於回傳 1 ,等於回傳 0 ,小於回傳 -1』
的錯誤解釋,
http://download.oracle.com/javase/tutorial/java/data/comparestrings.html
理的解釋是比較籠統,但也是沒有提到1跟-1,
有關java api,建議到java api會比較清楚
http://download.oracle.com/javase/1,5.0/docs/api/
http://download.oracle.com/javase/6/docs/api/

String的compareTo()會有兩種回傳值,
首先是依序計算this和anotherString每個字元的差,

his.charAt(k)-anotherString.charAt(k)

如果計算出來的值不是0,就會回傳該值。
您的舉例就是拿'I'跟'H'相比,當然只有1跟-1,
這隨便多比較幾個例子就知道不是您說的那樣了,
簡單一點在您的舉例裡多印出a.compareTo(c)或b.compareTo(c)也可以。

如果k的值已經指到this和anotherString較短字串的最後一個字元,
都沒發現不同字元時,像是"ab".compareTo("abcde"),
String的compareTo()會改回傳兩字串的長度差

this.length()-anotherString.length()

所以
"ab".compareTo("abcde") 回傳-3,
"abcdefg".compareTo("abcde") 回傳2。

另外您針對Number的compareTo()解釋一樣有誤
http://pydoing.blogspot.com/2010/12/java-compareto.html
舉的例子也是很碰巧都是差1(應該不是刻意的吧),
您可以多拿一點數字來比較就知道絕對不是
『本身大於參數, compareTo() 會回傳整數 1 ,反之本身小於參數, compareTo() 會回傳整數 -1 。』

希望您能修改一下您的文章,
避免不清楚的網友被誤導了,謝謝!

Kaiching Chang 提到...

內文已修改,感謝指正 ^^

花生狼 提到...

指正不敢當,只是剛好有研究過這個method而已~~
我是很常在貴站吸取知識的 :D