2010-08-04 10 views
9

Wie kann ich ein Array zuerst nach Länge, dann alphabetisch sortieren?Sortieren Array zuerst nach Länge dann alphabetisch in Java

Ich habe eine Liste der Dinge, mit Zahlen auf ihnen, und ich bin derzeit immer:

something1 Something10 something2 something3

Während ich bekommen:

something1 something2 something3 Something10

+1

Durch eine Chance, Hausaufgaben? –

+0

Nein, ich habe nur eine Menge Dateien, die ich wirklich schnell umbenennen wollte. Sie sind nummeriert, aber die Zahlen müssen etwas verschoben werden, und der Rest des Dateinamens ändert sich. Aber die natürliche Reihenfolge durch das Betriebssystem gibt in der Regel 1 10 11 12 13 14 15 16 17 18 19 2 20 usw. – Brian

+1

Haben Sie versucht, nur führende Nullen in Ihren Zahlen zu verwenden? IE, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11. –

Antwort

24
public class MyComparator implements Comparator<String>{ 
    @Override 
    public int compare(String o1, String o2) { 
     if (o1.length() > o2.length()) { 
     return 1; 
     } else if (o1.length() < o2.length()) { 
     return -1; 
     } 
     return o1.compareTo(o2); 
    } 
} 

Dann nutzen:

Collections.sort(yourList, new MyComparator()); 
+0

Komparator erfordert int compareTo (Obj o), nicht vergleichen (Object o1, Object o2). Dieser Code ist jedoch in der Nähe. – Starkey

+3

@Starkey: Das ist vergleichbar. Das ist Komparator. Du warst nahe dran. –

+0

Danke, ich musste nur einige Dateinamen sortieren, die wirklich schnell Zahlen enthalten und sie umbenennen. Ich hatte sie in einem Array, also musste ich es in eine Sammlung konvertieren, aber das funktionierte für meinen Zweck. Vielen Dank! – Brian

4

Erstellen Sie einen Vergleicher, der zuerst nach der Länge vergleicht und bei gleicher Länge String.compareTo verwendet ().

+0

Beachten Sie auch das Vorhandensein von 'compareToIgnoreCase()'. –

1

zuerst nach Länge sortieren und dann wird lexikalisch nur funktionieren, wenn die Zeichenfolge Präfixe (das heißt der Teil vor der Zahl) die gleiche Länge in allen Fällen. Ich glaube, dass Sie wirklich einen Komparator schreiben möchten, der die Zeichenfolge und die numerischen Teile trennt und alphabetisch in der Zeichenfolge und numerisch in dem Nummerteil sortiert.

0

Definieren Sie eine Klasse, in der Ihr Objekt gespeichert werden soll. Scheint, als ob Sie ein String sein möchten.

Für diese Klasse müssen Sie die Vergleichsschnittstelle definieren und die zu vergleichende Logik in ihre abstrakte Methode einfügen.

 
int compareTo(T o) 

Zum Beispiel:

 
class MyString extends String 
{ 
    @Override 
    int compareTo(Object obj) 
    { 
    // put your logic in here. 
    // Return -1 if this is "less than" obj. 
    // Return 0 if this is equal to obj 
    // Return 1 if this is "greater than" obj. 

    // Test length first 
    if (length() < obj.length()) 
     return -1; 
    if (length() > obj.length()) 
     return 1; 

    // Lengths are the same, use the alphabetical compare defined by String already 
    return super.compareTo(obj); 
    } 
} 

Haftungsausschluss, ich habe eigentlich nicht diesen Code testen, aber es sollte zu schließen, was Sie wollen.

7

Hier ist eine kurze Java 8 Lösung:

List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3"); 
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo)); 

Oder Groß- und Kleinschreibung Version:

list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); 
Verwandte Themen