_ArraySort2D_MC 2D Array nach mehreren Spalten sortieren (Stand 08.08.2012)

  • Hallo com,

    hier ein kleines Skript zum sortieren von 2D-Arrays. Angregt worden bin ich dazu durch [ gelöst ] _ArraySort sortiert "komisch".
    Man kann nach folgenden Formaten für die Sortierung angeben: Numerisch, Datum (normal JJJJ/MM/TT), Geburtstag (MM/TT/JJJJ) und natürlich ohne (Standard = ASCII).

    Update: honzugekmmen sind Start- und Endparmeter, so dass die Funktin auch auf Arrays mit Überschrift in Zeile 0 angewendet werden kann. Desweiteren kann jetzt auch absteigend sortiert und einmalige Einträge erzwungen werden. Diese beiden Parameter beziehen sich auf alle Spalten einer Zeile.

    Demo (wie einsetzen):

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <date.au3>
    #include <arraySort2D_MC.au3>

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

    Global $array[10000][3]
    $array[0][0] = "Text"
    $array[0][1] = "Zahl"
    $array[0][2] = "Datum"
    For $i = 1 To 9999
    ;rein Ascii
    $array[$i][0] &= Chr(Random(65, 90, 1))
    For $j = 1 To 9
    $array[$i][0] &= Chr(Random(97, 122, 1))
    Next
    ;Zahl
    $array[$i][1] = Random(1, 999, 1)
    For $j = 1 To Random(0, 6, 1)
    if $j = 1 Then $array[$i][1] &= ","
    $array[$i][1] &= Chr(Random(48, 57, 1))
    Next
    ;Datum
    $array[$i][2] = Random(1, 31, 1) & "." & Random(1, 12, 1) & "." & Random(1945, 1994, 1)
    Next

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

    _ArrayDisplay($array, "Unsortiert")

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

    ;Numerische Sortierung
    $bench_start = TimerInit()
    ;Func _arraySort2D_MC(ByRef $avArray, $ColOrder, $iStart=0,$iEnd=0,$iDesc=0,$bDelDuplictes=False)
    _arraySort2D_MC($array, "1%N|2%D|0", 1)
    $bench_end = Round(TimerDiff($bench_start), 2)
    ConsoleWrite("Laufzeit _arraySort2D_MC: " & $bench_end & " ms!" & @CRLF)
    _ArrayDisplay($array, "sortiert nach Col 1 als Zahl (1%N|2%D|0|)")

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

    ;sortierung nch Datum JJJJ/MM/TT
    $bench_start = TimerInit()
    _arraySort2D_MC($array, "2%D|0|1%N", 1)
    $bench_end = Round(TimerDiff($bench_start), 2)
    ConsoleWrite("Laufzeit _arraySort2D_MC: " & $bench_end & " ms!" & @CRLF)
    _ArrayDisplay($array, "sortiert nach Col 2 als Datum (2%D|0|1%N)")

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

    ;Sortierung nach Geburtstag MM/TT/JJJJ
    $bench_start = TimerInit()
    _arraySort2D_MC($array, "2%G|0|1%N", 1)
    $bench_end = Round(TimerDiff($bench_start), 2)
    ConsoleWrite("Laufzeit _arraySort2D_MC: " & $bench_end & " ms!" & @CRLF)
    _ArrayDisplay($array, "sortiert nach Col 2 als Geburtstag (2%G|0|1%N)")

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

    ;und jetzt doppelte Zeilen erzeugen
    For $i = 1 To 99 Step 2
    For $j = 0 To 2
    $array[$i][$j] = $array[$i + 1][$j]
    Next
    Next
    ;normale Sortierung absteigend doppelte Zeilen verhindern
    $bench_start = TimerInit()
    _arraySort2D_MC($array, "0|1%N|2%D", 1, 0, 1, True)
    $bench_end = Round(TimerDiff($bench_start), 2)
    ConsoleWrite("Laufzeit _arraySort2D_MC: " & $bench_end & " ms!" & @CRLF)
    _ArrayDisplay($array, "sortiert nach Col 0 als Text absteigend doppelte Zeilen werden gelöscht (0|1%N|2%D|")

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


    ScreenShots:
    autoit.de/wcf/attachment/7950/
    autoit.de/wcf/attachment/7951/

    bisherige Downlads: 184

    mfg (Auto)Bert

  • Da stimmt immer noch was nicht!

    Der Dateianghang ist gleich dem Code im Spoiler, aber wo ist die #include <arraySort2D_MC.au3> Datei?

    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hallo UEZ,

    aller guten Dinge sind 3. Nein Scherz beiseite, was beim 1. Mal los war weis ich nicht, beim 2. Versuch habe ich aus Versehen die falsche Datei hochgeladen. Jetzt habe ich vorsichtshalber auch die func in einem Spoiler in den Text eingefügt.
    Sorry ich hoffe aber dass du die func trotzdem noch testest und Rückmeldung gibst,

    mfg (Auto)Bert

  • Schön schnell :thumbup: und nette Idee! Kann mich nur Oscar anschließen!

    Nur, wenn ich _arraySort2D_MC($array, "3%D|2%N|0|1") benutze, wird das Array nicht richtig erstellt! Spalte 2 wird nicht erstellt! Scheint noch ein Bug zu sein!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯