Ich habe da ein kleines Problem und komme da nicht weiter, ich möchte meine Items im Treeview wie folgt sortieren.
bis jetzt ist es so:
Ordner 1
Ordner 11
Ordner 2
ich hätte es aber gerne so:
Ordner 1
Ordner 2
Ordner 11
Ich adde die Nodes in eine "ObservableList<TreeItem<PathItem>>" und die muss man doch irgendwie sortieren können oder geht das garnicht mit der "ObservableList"?
Hier noch ein paar Anmerkungen:
Das "Problem" beim Sortieren von Namen, bei denen auch noch ein Index berücksichtigt werden soll, ist, dass eine Zahl in einem String als Charakter angesehen wird, damit wird bei der Sortierung Ordner 1, Ordner 11 und dann erst Ordner 2 sortiert.
Da du aber den nach dem Index im Namen sortieren möchtest, muss die Sortierung der Liste auch mit dem Index gemacht werden.
Dazu wird im Code das Comparator-Interface benutzt. Mit diesem wird der String: "Ordner ", der für alle Items gleich ist, entfernt. Damit bleibt nur noch eine Nummer als String. Diese wird dann als int geparsed und dann wird der Vergleich mit den 2 Nummer gemacht.
Das ganze funktioniert jedoch nur solange, wie die Verzeichnisse mit "Ordner " anfangen und dann eine Zahl folgt. Wenn nach der Zahl wieder andere Charakter folgenen, fliegt das ganze hoch... NumberFormatException.
Besser wäre vielleicht, wenn du mit Regex den Index ermittelst.
Vielen Dank erstmal, ich mal schauen, ob ich da was hinbekomme.
Leider ist es genau so, wie du es als letztes beschrieben hast, es könnte eben vorkommen, das die Zahl überall stehen könnte oder es gibt keine Zahl.
Im Prinzip soll die sortierung genau wie im Windows-Explorer aussehen.
importjava.util.ArrayList;importjava.util.Comparator;importjava.util.Iterator;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassWindowsExplorerComparatorimplementsComparator<String>{privatestaticfinalPattern splitPattern =Pattern.compile("\\d+|\\.|\\s");@Overridepublicintcompare(String str1,String str2){Iterator<String> i1 =splitStringPreserveDelimiter(str1).iterator();Iterator<String> i2 =splitStringPreserveDelimiter(str2).iterator();while(true){//Til here all is equal.if(!i1.hasNext()&&!i2.hasNext()){return0;}//first has no more parts -> comes firstif(!i1.hasNext()&& i2.hasNext()){return-1;}//first has more parts than i2 -> comes afterif(i1.hasNext()&&!i2.hasNext()){return1;}String data1 = i1.next();String data2 = i2.next();int result;try{//If both datas are numbers, then compare numbers
result =Long.compare(Long.valueOf(data1),Long.valueOf(data2));//If numbers are equal than longer comes firstif(result ==0){
result =-Integer.compare(data1.length(), data2.length());}}catch(NumberFormatException ex){//compare text case insensitive
result = data1.compareToIgnoreCase(data2);}if(result !=0){return result;}}}privateList<String>splitStringPreserveDelimiter(String str){Matcher matcher = splitPattern.matcher(str);List<String> list =newArrayList<String>();int pos =0;while(matcher.find()){
list.add(str.substring(pos, matcher.start()));
list.add(matcher.group());
pos = matcher.end();}
list.add(str.substring(pos));return list;}}