2017-03-11 31 views
3

Ich gebe gerade eine ArrayList weiter, um die Titel eines TabLayouts in Android zu füllen. Die Elemente im Array sind Strings: ["RCP", "RYL", "1", "2", "3", "4", "5", "6"]. Aber nicht unbedingt in dieser Reihenfolge.Java ArrayList mit Buchstaben vor Zahlen sortieren

Ich möchte die Liste mit den Buchstaben-Elementen zuerst (alphabetisch) zurückgegeben werden und dann Ganzzahlen steigen, inkrementell.

Ich habe versucht, die Collections.sort Methode verwendet, aber dies gibt eine Liste der Anstieg numerisch und fügt dann die „R“ Strings zuletzt: ["1", "2", "3", "4", "5", "6", "RCP", "RYL"]

Um zu klären, ich möchte meine Arraylist sortieren, so dass es wieder ["RCP", "RYL", "1", "2", "3", "4", "5", "6"] Es muss auch flexibel sein, da die Titel der "R", Saiten, sich wahrscheinlich ändern werden.

Dank

+3

Komparator Individuelle funktionieren könnte. – duffymo

+0

Werden sich auch die ganzen Zahlen ändern? Könnten Sie zu einem bestimmten Zeitpunkt zwei- oder mehrstellige Zahlen haben und im Ergebnis "9" vor "10" stehen? –

+0

Den ganzen Zahlen wird wahrscheinlich ein String-Wert nachgestellt. I.e. '[" 1AB "," 1AV "]'. Diese müsste dann in der Reihenfolge String Präfix zuerst, dann numerisches Präfix nach zB '[" RCA "," RLM "," 1EP "," 1FT "," 2LJ "," 2MO "]' Also weiter und so fort . Ich habe das noch nicht überprüft ... – dantan04

Antwort

2

Wenn Sie Strings, die Zahlen darstellen, Vorrang vor Strings geben möchten, die dies nicht tun, sollten Sie Ihre eigene Comparator schreiben und sie an die Collections.sort-Methode übergeben.

Dies ist ein einfacher Ansatz für Ihr Problem: Überprüfen Sie, ob einer der Strings eine Zahl ist, wenn ja, geben Sie dem String, der keine Zahl ist, Priorität. Wenn beide Zahlen oder Zeichenfolgen sind, verwenden Sie die Methode compareTo der Zeichenfolge.

Ich hoffe, es hilft.

public class Main { 

    private static int customCompare(String a, String b) { 
     return isThereAnyNumber(a, b) 
       ? isNumber(a) ? 1 : -1 
       : a.compareTo(b); 
    } 

    private static boolean isThereAnyNumber(String a, String b) { 
     return isNumber(a) || isNumber(b); 
    } 

    private static boolean isNumber(String s) { 
     return s.matches("[-+]?\\d*\\.?\\d+"); 
    } 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); 
     Collections.sort(list, Main::customCompare); 
     System.out.println(list); 
    } 
} 

UPDATE

Sie können eine anonyme innere Klasse verwenden, die die Comparator Schnittstelle bei implementiert sind Sie nicht mit Hilfe von Java 8.

public class Main { 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("RCP", "RYL", "1", "2", "3", "4", "5", "6"); 
     Collections.sort(list, new Comparator<String>() { 
      private boolean isThereAnyNumber(String a, String b) { 
       return isNumber(a) || isNumber(b); 
      } 

      private boolean isNumber(String s) { 
       return s.matches("[-+]?\\d*\\.?\\d+"); 
      } 

      @Override 
      public int compare(String a, String b) { 
       return isThereAnyNumber(a, b) 
         ? isNumber(a) ? 1 : -1 
         : a.compareTo(b); 
      } 
     }); 
     System.out.println(list); 
    } 
} 
+0

Danke für Ihre Mühe. Ich kann 'Collections.sort (list, Main :: customCompare) nicht aufrufen;' in Android wird jedoch angezeigt: "Methodenreferenzen werden auf dieser Sprachebene nicht unterstützt". Irgendwelche Ideen? – dantan04

+0

@ dantan04 Ich habe eine neue Lösung zur Verfügung gestellt, die keine Lambdas verwendet, falls Sie Java 8 nicht verwenden oder in Android einige Dinge, die ich verwendet habe (wie Methodenreferenzen) nicht unterstützt werden. Hoffe es klappt jetzt. – acontell

+0

Das hilft sehr! Ich habe dies erstellt über: 'Collections.sort (Liste, neue Vergleicher () { @Override public int vergleichen (String s, String t1) { customCompare (s, t1); return 0;} }); ' Welche gibt die Liste : '[" 6 "," 5 "," 4 "," 3 "," 2 "," 1 "," R "]' Ich brauche das jetzt umzukehren, gibt es eine Methode dafür? – dantan04

4

Es gibt eine Überlastung für Collections.sort, die in einem Comparator nehmen, mit dem Sie die Sortierreihenfolge für Ihre Artikel definieren können. In diesem Fall müssen Sie nur Ihre eigene Implementierung der Comparator Schnittstelle definieren, die Ihnen gefällt.

+0

Danke, ich lese jetzt gerade die 'Komparator'-Dokumentation durch. (Ich lerne gerade Android aus einem guten Buch, also ist es ein stetiger Fortschritt). – dantan04

Verwandte Themen