Sortierung, wie im Explorer-Tree - wie gehts?

    • Offizieller Beitrag

    Hi,

    ich lese die Ordner eines Pfades aus um sie in einem Tree darzustellen. Schaue ich mir den Ordner im Explorer an, werden auch Zahlen in Strings nach den Zahlen sortiert:

    Wenn ich mit _FileListToArrayRec($sPath, "*", $FLTAR_FOLDERS, $FLTAR_NORECUR, $FLTAR_SORT) einlese ist es String-sortiert:

    Das gleich ist in der Konsole mit TREE der Fall:
    tree_cmd.png

    Wie kann ich die Sortierung, wie im Explorer erreichen?

    • Offizieller Beitrag

    Es gibt bereits eine UDF (Anhang / nicht von mir), die das Array "richtig" sortieren kann. Die hatte ich mir vor langer Zeit mal abgespeichert, weil ich so eine Funktion selbst mal brauchte.

    Du brauchst dann nur noch die Funktion aufrufen und das Array ist korrekt sortiert:

    AutoIt
    #include <Array.au3>
    #include <File.au3>
    #include "_ArrayNaturalSort.au3"
    $sPath = "" ; <- anpassen
    $aFileList = _FileListToArrayRec($sPath, "*", $FLTAR_FOLDERS, $FLTAR_NORECUR, $FLTAR_SORT)
    _ArrayDelete($aFileList, 0)
    _ArrayNaturalSort($aFileList)
    _ArrayDisplay($aFileList)
    • Offizieller Beitrag

    Ich habe mir jetzt eine eigene Routine erstellt.
    Grundprinzip:
    - wenn am Itemanfang Zahlen sind (optional auch in Klammern, also "(1) Bla" oder "[2] Blub") werden diese mit Vornullen versehen
    - dazu werden die Einträge in einem temporären Array gespeichert
    - der Index im Original-Array wird ebenfalls im Temp-Array gespeichert
    - das Temparray wird nun anhand des mit Vornullen ergänzten und dadurch als String sortierbarem Array, in der Spalte Name sortiert
    - die Original-Item werden jetzt aus dem Originalarray an die umgeordneten zugehörigen Indexpositionen geschrieben
    - das Originalarray wird mit dem sortierten ersetzt

    EDIT:
    Das berücksichtigt jetzt nicht, wenn die Zahlen nicht am Stringanfang auftauchen. Da dann meist die Sortierung etwas untergeordnet ist, sehe ich das aber als unproblematisch. Für meine Zwecke reicht die Prüfung auf Zahlen am Anfang aus.

    EDIT_2:
    Sehe jetzt erst Oscars Beitrag, mal diese UDF in Augenschein nehmen.

  • Für exakt solche Fälle wo man mal individuell sortieren muss hab ich in meiner DynArray-UDF eine Sortierfunktion geschrieben bei der man ganz leicht die Größenvergleichsfunktion austauschen kann.
    So kann man ganz schnell und einfach individuelle Sortierungen umsetzen:

  • Ich habe hier mal alle Ergebnisse in einem Array zusammengefaßt, damit man besser vergleichen kann, welche Funktion wie sortiert.

    Keine macht es zu 100% so, wie der Explorer.

    Spoiler anzeigen
  • Keine macht es zu 100% so, wie der Explorer.

    Das war doch lediglich ein Beispiel um zu zeigen wie man sich relativ einfach die Sortiervorschrift entsprechend anpassen kann.
    Etwas erweitert könnte man die Vergleichsfunktion z.B. so implementieren:

    Den letzten verbleibenden Fall mit Bla 9 und Bla 10 überlasse ich demjenigen der es braucht.

  • Ich verstehe deinen Einwand!

    Meine Aussage bezieht sich allerdings nur auf die Ergebnisse der hier vorgestellten Funktionen, ohne deren Status zu analysieren.

    Bezieht man den Status mit ein, dürfte deine Funktion natürlich nicht (ohne erklärenden Kommentar) in dieser Liste aufgeführt werden.

    Wie hätte ich es denn besser formulieren sollen?

    Dein erweitertes Beispiel liefert übrigens dasselbe Ergebnis, wie die einfache Funktion.

  • Wie hätte ich es denn besser formulieren sollen?

    War schon ok. Wollte bloß den Eindruck vermeiden, dass mein Vorschlag bereits eine fertige Lösung für das Problem der Explorer-ähnlichen Sortierung darstellt.

    Die kommt stattdessen jetzt ;) :

    Edit: Das eben gezeigte ist die reine AutoIt-Lösung.
    Um ganz sicher zu gehen, dass exakt so wie beim Explorer sortiert wird, sollte man stattdessen eher direkt dessen interne Vergleichsfunktion anzapfen:

  • Wow!!!

    Das ist ja jetzt mal echt mega-geil, was du hier abziehst!

    Wirklich sehr schön finde ich, dass du das ursprüngliche 'Beispiel' nun doch perfektioniert hast und man somit immer eine echte Alternative zu dem DllCall() hat.


    Bin echt begeistert...

    Hm, bei der Explorer-Lösung scheint mir die normale Sortierung aber überflüssig... die wird wohl nie ausgeführt.


    __
    Grrr, was ist das denn für ein oberschwuler Editor hier auf autoit.de? Der spinnt zeitweise aber total. Will ich mit Enter einen Zeilenumbruch generieren, nimmt der die halbe Zeile einfach mit in die neue Zeile!? Im erweiterten Modus geht es aber dann.

    Boar, will mittlerweile in jedem Editor mit Strg+Shift+Up/Down die Zeilen vertauschen... und wundere mich gerade, dass es hier nicht geht.

  • Hm, bei der Explorer-Lösung scheint mir die normale Sortierung aber überflüssig... die wird wohl nie ausgeführt.

    In dem Fall hier nicht.
    Aber wenn im Array z.B. direkte Zahlentypen stecken dann schon.
    Füge mal noch die Werte [1.5, 1.45, 1.55] hinzu (nicht als String sondern als reine Zahlen) und schau dir die Sortierung einmal mit der Zeile und einmal ohne an.

  • Ja du hast Recht - die normale Sortierung wird demnach definitiv benötigt.

    Hm... da stimmt aber noch etwas nicht mit der Sortierung... siehe Bild.

    Nachtrag: Und jetzt wo ich die Zahlen eingebaut habe, bekomme ich bei jedem 3-5 Aufruf einen Fehler... siehe Bild (WEnd.png).

  • ok kann es nachvollziehen.
    Liegt an einem Problem beim Quicksort mit zwei Pivotelementen.
    Hab die DynArray.au3 mal entsprechend angepasst.
    Nochmal runterladen und die alte ersetzen dann sollte es klappen.

    Genau genommen ist der Grund die Durchmischung mit verschiedenen Dateitypen.
    Wenn man die Floatzahlen (1.45, 1.55, 1.5) rausnimmt und nur noch Strings vorhanden sind ist das Problem behoben.
    Im Grunde werden dabei zwei Vergleichsmethoden angewendet welche untereinander inkonsistent sind und somit eine Art Barriere während der Sortierung geschaffen.
    Ist schon ein ziemlicher Sonderfall - wenn auch ein sehr interessanter.
    Ich schau mal ob ich den so mit abfangen kann.

    Edit: So ist kein Fehler in der Dynarray.au3.
    Es ist wie gesagt der Sonderfall bei der Durchmischung der Datentypen.
    Es reicht im Prinzip in der Vergleichsfunktion aus dem And ein Or zu machen.
    Also so:

    Edit2: Hab auch die reine AutoIt-Lösung oben entsprechend angepasst so dass dieser Sonderfall mit beachtet wird.