2017-06-14 61 views
1

你好,我需要我的排序數組列表,它包含以下類型的數據:的Java對象的排序與ArrayList的字母數字串

name1 1111 1622 122ks 
name3 1211 4122 1aks 
name2 1113 1322 12sks 
name10 2111 1222 12dks 
... 
name4 asd1 2334 asd8 

有簡單的模型類來填充日期!現在我想要做的是比較名稱的基礎上,即名稱1與名稱2相比等等。爲此,我這樣做:

public class ABC implements Comparator<MyModel> { 
    @Override 
    public int compare(MyModel o1, MyModel o2) { 
    return o1.name.compareTo(o2.name); 
    } 
}  

它給我輸出,我需要!但是,當有命名超過10我的意思後10 11 12我比較名稱不會讓我,因爲我需要所需的排序列表,輸出變爲:

name1 1111 1622 122ks 
    name10 1211 4122 1aks 
    name11 1113 1322 12sks 
    name12 2111 1222 12dks 
    ... 
    name2 asd1 2334 asd8 
    ... (sorted so on) 

我已經做錯了什麼?我的做法是錯誤的還是有其他方法可以實現它!提前致謝!

+0

這因爲空格字符在排序順序上被認爲比其他字符(例如數字)更低,所以發生排序。此外,每個字符都是單獨比較,不會彙總爲數字。如果您想按照您的預期對所處理的數字進行排序,您需要編寫自己的比較器。 – Jason

回答

3

這是因爲這些數字(1,10,2)被視爲字符串。 所以你會得到這些訂單 name1 name10 name2

你想被稱爲自然排序請看

Natural sort order string comparison in Java - is one built in?

Java String Number Comparator

樣東西:https://repl.it/ImA2/1

+0

https://github.com/paour/natorder/blob/master/NaturalOrderComparator.java給了我完全錯誤的輸出 –

+0

輸出怎麼樣? – Kossel

+0

name11 name12 name13 ... name1 ... name2 –

0

如果name是恆定的,你可以在您的中使用來比較之後的數字。例如:

public class ABC implements Comparator<MyModel> { 
    @Override 
    public int compare(MyModel o1, MyModel o2) { 
    return Integer.parseInt(o1.name.substring(4))-Integer.parseInt(o2.name.substring(4)); 
    } 
} 

編輯

如果名稱不恆定,可以遍歷名字最先找到的第一個數字和索引從索引保存到substring