2017-06-14 6 views
1

こんにちは、私は、データの以下のようなものが含まれている私の配列リストをソートする必要があります。JavaのソートオブジェクトのArrayListが

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

日付を移入するための単純なモデルクラスがあります!さて、名前の基底、すなわちname1とname2との比較などを行いたい。このために私は次のようにしています:

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

これは私に必要な出力を与えます!名前は、私は10 11 12の後に名前を平均10以上がある場合でも、私は必要があるとして、私のコンパレータは文句を言わない私に必要なソートされたリストを与えると、出力は次のようになります。私が間違ってやって

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

何?私がやっているやり方は間違っているのですか、それを達成するための他の方法がありますか?前もって感謝します!

+0

これからsubstringにインデックスを保存することができますソートは、スペース文字がソート順に数字などの他の文字よりも低いとみなされるために発生します。また、各文字は個々に比較され、数値に集計されることはありません。期待どおりに処理されている数値でソートする場合は、独自のコンパレータを記述する必要があります。 – Jason

答えて

3

これらの数字(1,10,2)が文字列として扱われているからです。 ので、あなたが

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

Java String Number Comparator

でサンプルを見てください並べ替えナチュラル何がしたいと呼ばれるこれらのため name1 name10 name2

を取得します:あなたは、nameが一定であればhttps://repl.it/ImA2/1

+0

https://github.com/paour/natorder/blob/master/NaturalOrderComparator.javaは完全に間違った出力を返します –

+0

出力はどうですか? – Kossel

+0

名前11 名前12 名前13 ...名前1 ...名前2 –

0

をにsubstringを使用できますそれ以降の数値を比較するには3210を使用します。たとえば、次のように

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)); 
    } 
} 

EDIT

名前が一定でない場合は、最初に名前をループ最初の数字を検索し、そのインデックス