2012-06-04 174 views
1

我只是想看看是否有一個簡單的方法來排序字符串對象列表。我現在面臨的問題是Collections.sort(...)方法不適合我。排序字符串對象

這是我最初的名單,這對於我的要求的目的進行排序:

List<String> values = new ArrayList<String>(); 


    values.add("section_1"); 
    values.add("section_2"); 
    values.add("section_3"); 
    values.add("section_4"); 
    values.add("section_5"); 
    values.add("section_6"); 
    values.add("section_7"); 
    values.add("section_8"); 
    values.add("section_9"); 
    values.add("section_10"); 
    values.add("section_11"); 
    values.add("section_12"); 
    values.add("section_13"); 

而且做Collections.sort(值),訂單現在分成後:

section_1 
section_10 
section_11 
section_12 
section_13 
section_2 
section_3 
section_4 
section_5 
section_6 
section_7 
section_8 
section_9 

這是行爲是因爲Collections.sort(...)中使用的詞典排序?有沒有一種更簡單的方法可以按照我想要的方式進行這種排序?

在此先感謝。

+0

可能的重複[自然排序順序字符串比較在Java中 - 是內置?](http://stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-一個內置的) –

回答

1

你需要使用提取字符串的數字部分的自定義比較,將其轉換成整數的情況下,和比較這些整數:只是使用字符串代替

public class SectionComparator implements Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     Integer i1 = Integer.valueOf(s1.substring(s1.indexOf('_') + 1)); 
     Integer i2 = Integer.valueOf(s1.substring(s2.indexOf('_') + 1)); 
     return i1.compareTo(i2), 
    } 
} 

代表節,你也可以使用Section對象,它們將具有數字屬性,toString()方法以及使用number屬性的自然排序。

9

此行爲是因爲Collections.sort(...)中使用的字典順序嗎?

絕對。您已按照自然順序對字符串進行了排序。

有沒有更簡單的方法使這種排序工作的方式我想要它?

創建實施Comparator<String>它表示要使用比較類,並傳遞作爲第二個參數Collections.sort。你必須自己編寫邏輯(或者找一個第三方庫來這樣做)。我認爲標準庫中沒有任何東西可以做到這一點。 (你要考慮區分大小寫,並可能其他各種東西。)

當然,如果你可以改變你的數據section_01section_02等,這將意味着你可以只使用天然排序順序...

+0

@NominSim:我剛剛添加了同樣的東西:) –

+0

是的,剛剛看到並刪除了我的評論哈哈。 – NominSim