Array sortieren

  • Hallo zusammen,

    folgendes array möchte ich sortieren, aber es geht nicht wie gewünscht.

    [autoit]

    #include <array.au3>

    [/autoit][autoit][/autoit][autoit]

    Dim $array[8] = ["img12xx-A.jpg", "img12xx-5.jpg", "img12xx-7.jpg", "img12xx-B.jpg", "img23xx-B.jpg", "img23xx-6.jpg", "img23xx-7.jpg", "img23xx-A.jpg"]

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($array)
    _ArraySort($array,0)
    _ArrayDisplay($array)

    [/autoit]

    Ergebnis:
    img23xx-6.jpg
    img23xx-7.jpg
    img23xx-A.jpg
    img23xx-B.jpg
    img12xx-5.jpg
    img12xx-7.jpg
    img12xx-A.jpg
    img12xx-B.jpg

    Wunsch wäre aber so:
    img23xx-A.jpg
    img23xx-B.jpg
    img23xx-6.jpg
    img23xx-7.jpg
    img12xx-A.jpg
    img12xx-B.jpg
    img12xx-5.jpg
    img12xx-7.jpg

    _ArraySort($array,0) auf _ArraySort($array,1) bringt auch nichts.

    Hat jemand eine Idee?

    Danke.
    leertaste

    Einmal editiert, zuletzt von leertaste (10. Dezember 2007 um 23:10)

  • Hi,

    hab mich mal daran probiert

    Dies ist rausgekommen

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<ArrayMore.au3>
    Dim $array_neu[100][2]
    Dim $array[8] = ["img12xx-A.jpg", "img12xx-5.jpg", "img12xx-7.jpg", "img12xx-B.jpg", "img23xx-B.jpg", "img23xx-6.jpg", "img23xx-7.jpg", "img23xx-A.jpg"]
    For $i = 0 to UBound($array) -1
    $split = StringSplit($array[$i], "-")
    $array_neu[$i][0] = $split[1]
    $array_neu[$i][1] = $split[2]
    $count = Stringleft($array_neu[$i][1], 1)
    $zahl = StringIsDigit($count)
    If $zahl = 1 Then $array_neu[$i][1] = "ZZZZ" & $array_neu[$i][1]
    Next
    ReDim $array_neu[$i][2]
    _ArrayDisplay($array_neu, "zweispaltig")
    _ArraySort_2ary($array_neu, 0, 1, True)
    _ArrayDisplay($array_neu, "teilweise sortiert")
    For $i = 0 to UBound($array_neu) -1
    $array_neu[$i][1] = StringReplace($array_neu[$i][1], "ZZZZ", "")
    Next
    _ArrayDisplay($array_neu, "vollständig sortiert")

    [/autoit]

    Müsste funktionieren.

    Ist denke ich umständlich, aber es geht :)

    Falls du noch mehr Probleme damit hast, fragst du am besten den King of Array BugFix :rofl:

    Der wird dir sicher weiterhelfen können.


    PS: Für mein Script brauchst du seine Arraymore.au3

    ArrayMore.au3

    • Offizieller Beitrag

    In einem Schritt ist das nicht möglich.
    Sortiere erst so, dass die Reihenfolge (img23...) stimmt.
    Nun teile das Array an der Position, wo der Wechsel nach (img12...) stattfindet. (_Array2DSplit aus meiner Sig)
    Sortiere das img12.. Array wie gewünscht und füge beide mit _Array2DJoin aus meiner Sig wieder zusammen.

    • Offizieller Beitrag

    Tweaky
    Stimmt, er will die Sortierreihenfolge umkehren, aber nicht so richt ig, nur ein bischen. :P

    Eine wirkliche allgemeingültige Lösung ist hier eigentlich nicht machbar, da die Sortiervorgabe nicht 'sinnvoll' ist.
    Kommen noch mehr Dateien mit unterschiedlichen Namen hinzu, wirds total unübersichtlich.
    Meine Frage ist hier: Wieso tragen die Bilder soch unterschiedliche Kennung und welchen Sinn hat es sie so seltsam zu ordnen?
    Da ist es vermutlich viel einfacher sie umzubenennen.

  • Eine wirkliche allgemeingültige Lösung ist hier eigentlich nicht machbar, da die Sortiervorgabe nicht 'sinnvoll' ist.
    Kommen noch mehr Dateien mit unterschiedlichen Namen hinzu, wirds total unübersichtlich.
    Meine Frage ist hier: Wieso tragen die Bilder soch unterschiedliche Kennung und welchen Sinn hat es sie so seltsam zu ordnen?
    Da ist es vermutlich viel einfacher sie umzubenennen.


    Hi,

    die unterschiedliche Kennung benutze ich für schwarz-weiss und farbige Bilder bei verschiedenen Bearbeitungen. Die Sortierreihenfolge kommt dadurch zustande, dass eine Sortierung nach Datum leider manchmal nicht der Reihenfolge A,B,0,1 entspricht. Ich starte bei A......Z und springe dann nach 0...... bis unendlich. Wieso auch immer das Datum (modified) nicht dieser Reihenfolge entspricht.

    Eine andere Idee wäre zuerst alle Dateien mit -A..... ins array zu nehmen und zu löschen bis auf die aktuellste. Dann alle mit -1....... und als letzten Schritt Buchstabe und Zahl ins array nehmen. Dadurch vereinfacht sich die Sortierung dramatisch.

    Die einzige Hürde die ich habe ist die Ermittlung ob eine Zahl oder ein Buchstabe nach dem - steht. Irgendwie mit StringIsAlpha und StringIsDigit.....

    Danke.

    leertaste

  • Hi,

    hab den den code von Tweaky abgeändert um nur Dateinamen im array zu haben die mit -A usw enden. Aber irgendwo ist ein Fehler. Das Script läuft ohne einer Fehlermeldung durch ohne etwas aus dem array zu entfernen.

    [autoit]

    ;#include<Array.au3>
    Dim $array_neu[100][2]
    Dim $array[8] = ["img12xx-A.jpg", "img12xx-5.jpg", "img12xx-7.jpg", "img12xx-B.jpg", "img23xx-B.jpg", "img23xx-6.jpg", "img23xx-7.jpg", "img23xx-A.jpg"]
    For $i = 0 to UBound($array) -1
    $split = StringSplit($array[$i], "-")
    $array_neu[$i][0] = $split[1]
    $array_neu[$i][1] = $split[2]
    Next
    ReDim $array_neu[$i][2]
    _ArrayDisplay($array_neu, "zweispaltig")
    For $i = UBound($array_neu) -1 To 0
    $count = Stringleft($array_neu[$i][1], 1)
    $zahl = StringIsDigit($count)
    If $zahl = 1 Then _ArrayDelete($array_neu, $i)
    Next
    _ArrayDisplay($array_neu, "ohne Buchstaben")

    [/autoit]

    Wo liegt der Fehler?

    Danke.

    leertaste

  • Hi,

    wie ich vermuter, funktioniert _arraydelete nur mit eindimentionalen Arrays (nur 1 Spalte)

    Du mußte im Forum nach BugFix`s arraymore.au3 suchen, dann klappt mit meinem Script

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<ArrayMore.au3>
    Dim $array_neu[100][2]
    Dim $array[8] = ["img12xx-A.jpg", "img12xx-5.jpg", "img12xx-7.jpg", "img12xx-B.jpg", "img23xx-B.jpg", "img23xx-6.jpg", "img23xx-7.jpg", "img23xx-A.jpg"]
    For $i = 0 to UBound($array) -1
    $split = StringSplit($array[$i], "-")
    $array_neu[$i][0] = $split[1]
    $array_neu[$i][1] = $split[2]
    Next
    ReDim $array_neu[$i][2]
    _ArrayDisplay($array_neu, "zweispaltig")
    For $i = UBound($array_neu) -1 To 0 Step -1
    $count = Stringleft($array_neu[$i][1], 1)
    $zahl = StringIsDigit($count)
    If $zahl = 1 Then _Array2DDelete($array_neu, $i)
    Next

    _ArrayDisplay($array_neu, "ohne Buchstaben")

    [/autoit]