2017-06-14 2 views
1

Hallo da muß ich meine Array-Liste sortieren, dass die folgende Art von Daten enthält:Java Sortierungsobjekt Arraylist mit alphanumerischen Zeichenfolge

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

Es ist einfach Modellklasse Datum zu füllen! Nun, was ich tun möchte, ist auf den Grundlagen des Namens zu vergleichen, z. B. Name1 im Vergleich zu Name2 und so weiter. Dafür mache ich wie:

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

Es gib mir die Ausgabe als ich erforderlich! Aber wenn es nennen sind mehr als 10 I Mean Namen nach 10 11 12 mein Komparator gewohnt gibt mir die erforderliche sortierte Liste als ich brauche, und der Ausgang wird:

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

Was ich falsch gemacht? Ist die Art, wie ich es tue, falsch oder gibt es einen anderen Weg, es zu erreichen? Danke im Voraus!

+0

Diese sparen Die Sortierung erfolgt, weil das Leerzeichen in der Sortierreihenfolge niedriger ist als andere Zeichen wie Zahlen. Außerdem wird jedes Zeichen einzeln verglichen, nicht zu Zahlen aggregiert. Wenn Sie mit den Zahlen wie erwartet sortieren möchten, müssen Sie Ihren eigenen Vergleicher schreiben. – Jason

Antwort

3

Es ist, weil diese Zahlen (1, 10, 2) als String behandelt werden. natürlich aussehen Sortierung bitte bei

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

Java String Number Comparator

Probe so werden Sie diese Reihenfolge name1 name10 name2

bekommen, was Sie wollen heißt: https://repl.it/ImA2/1

+0

https://github.com/paour/natorder/blob/master/NaturalOrderComparator.java gibt mir total falsche Ausgabe –

+0

wie ist die Ausgabe? – Kossel

+0

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

0

Wenn name konstant ist, Sie kann substring in Ihremverwenden, um Zahlen danach zu vergleichen. Zum Beispiel:

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:

Wenn der Name nicht konstant ist, können Sie eine Schleife durch den Namen zuerst die erste Stelle zu finden und den Index zu substring aus diesem Index

Verwandte Themen