2016-08-10 2 views
2
Sortierung

Ich habe ein List von Strings und ich möchte, dass sie sortieren:Wie erste Wort zu ignorieren, wenn

ICD10DatabaseHandler icd10Helper = new ICD10DatabaseHandler(getActivity()); 
      icd10Helper.open(); 
      List<Strings> icd10Favorites = icd10Helper.getFavoriteIcd10Tags(); 
      Collections.sort(icd10Favorites); 
      icd10Helper.close(); 
      return true; 

Mein Problem ist mein List haben ein id vor dem description und was ich eine Art produzieren wollen, ist der List ignoriert das erste Wort (id) des Elements.

Tatsächliche Ausgabe

A000 Cholera due to Vibrio cholerae 01 
A010 Typhoid fever with heart involvement 
A012 Paratyphoid fever B 

gewünschte Ausgabe:

A000 Cholera due to Vibrio cholerae 01 
A012 Paratyphoid fever B 
A010 Typhoid fever with heart involvement 
+6

ich mit dieser Lösung gehen würde: http://stackoverflow.com/questions/33063218/is -ist-möglich-zu-sortieren-eine-Array-Liste-während-ignorieren-die-zuerst-3-Zeichen-in (wenn Sie nicht wissen, die Länge des ersten Wortes, dann auf das erste Leerzeichen schneiden) . – Sarseth

+0

Verwenden Sie Ihre eigene Comparator-Implementierung. – m0skit0

Antwort

5

Wenn Sie nicht java8 verwenden können, müssen Sie Ihre eigene Comparator, zum Beispiel definieren:

class MyComparator<T> implements Comparator<String> { 
    private static String getDescription(String s) { 
     // get all String after CODE 
     String[] all = s.split(" ", 2); 

     // if there is some content 
     if (all.length >= 2) 
      // get it in LOWER CASE 
      return all[1].toLowerCase(); 
     else 
      return ""; 
    } 

    public int compare(String s0, String s1) { 
     return getDescription(s0).compareTo(getDescription(s1)); 
    } 

} 

USE

Collections.sort(elements, new MyComparator<String>()); 

HINWEIS:wenn Sie verwenden müssen mehrere Male, erstellen Sie eine Instanz statt Instanziieren im laufenden Betrieb


TEST IT

public static void main(String[] args) { 
    System.out.println("BEFORE SORTING"); 
    printList(elements); 

    Collections.sort(elements, new MyComparator<String>()); 

    System.out.println("\nAFTER SORTING"); 
    printList(elements); 
} 

private static void printList(List<String> list) { 
    for (String s : list) { 
     System.out.println(s); 
    } 

} 

ERGEBNISSE:

BEFORE SORTING 
A012 Paratyphoid fever B 
A010 Typhoid fever with heart involvement 
A000 Cholera due to Vibrio cholerae 01 

AFTER SORTING 
A000 Cholera due to Vibrio cholerae 01 
A012 Paratyphoid fever B 
A010 Typhoid fever with heart involvement 
+1

Danke @Jordi. kann fragen, was ich hinzufügen sollte, wenn ich möchte, dass es nicht empfindlich ist. Vielen Dank. –

+1

sicher, überprüfen Sie meine Bearbeitung, änderte ich auch die Art, wie ich die Zeichenfolge aufgeteilt, um alle Zeichenfolge außer CODE auf diese Weise erhalten Sie genauer sortieren. –

3
Collections.sort(
    list, 
    (a, b) -> a.split(" *", 2)[1].compareTo(b.split(" *", 2)[1]) 
); 

Benötigt Java 8 für das Lambda, die die Saiten auf dem ersten Platz in dem Satz spaltet und vergleichen was kommt danach.

Dies ist nicht definiert, wenn die Strings nicht mindestens zwei Wörter enthalten. Auch die Performance beim Vergleich könnte als nicht ideal angesehen werden.

Verwandte Themen