2015-04-12 255 views
3

我正在嘗試使用collection.sort()方法對兩個字符串進行排序,但是我遇到了理解實現邏輯的問題。這是我到目前爲止。我的實施有任何問題嗎? 注:我想他們按字母順序排序: 「蘋果」>「橙色」使用Collections.sort對字符串進行排序?

Collections.sort(mailbox.getMessages() , (String a, String b) -> { 
    if (String.valueOf(a.charAt(0)) > String.valueOf(b.charAt(0))) { 
     return -1; 
    } 
    else if (String.valueOf(a.charAt(0)) < 
     String.valueOf(b.charAt(0))) { 
     return 1; 
    } 
    else { 
     return 0; 
    } 
}); 
+1

是的,有問題。嘗試編譯它,看看它說什麼, –

+0

唯一的問題,我可以看到是否如果'a'或'b'有可能是'null'。您還應該只在字符之間執行1次比較並存儲結果。 – Obicere

+0

@Obicere:它只是對第一個字符進行排序。一般來說,字符串是按字典排序的。 –

回答

5

String實現Comparable<String>其被實現爲辭書比較,換句話說,默認情況下"Apple".compareTo("Orange") < 0。所以默認就足夠了。

現在Collections.sort有一個變種,藉此比較進去,你可以這樣簡單地使用:

Collections.sort(mailbox.getMessages()); 

關於自己的實現:

你不應該使用String.valueof投回字符串:您可以將char s與<進行比較,但不能在String s上使用此運算符。而且你執行不遞歸:如果兩個第一字符都是平等的,這並不意味着String的相等本身,例如"Apple""Ambiguous"。所以你必須實現一個更復雜的比較器。

+1

謝謝!我誤讀了API,並沒有看到compareTo()是詞法 – Shan

3

你不能用符號>比較String。你可以簡單地做:

Collections.sort(mailbox.getMessages(), (String a, String b) -> { 
    return Character.compare(a.charAt(0), b.charAt(0)); 
}); 

請注意,這將只根據第一個字符進行排序。如果你想用詞法分類整個字符串值,那麼你可以簡單地使用Collections.sort(mailbox.getMessages()),因爲String已經實現了Comparable

+1

爲什麼不只是'Character.compare(a.charAt(0),b.charAt(0))'呢? – Obicere

+0

@Obicere沒錯,我編輯過。 –

相關問題