Zweidimensionales Array nach Spalten sortieren

  • Hallo liebe Community,

    ich stehe vor folgender Herausforderung:

    Ein Array (s. Bild im Anhang) soll spaltenweise sortiert werden, d. h. die Elemente der ersten Zeile sind ausschlaggebend, da die Elemente darunter unter dem Element der ersten Zeile bleiben sollen, währenddessen die erste Zeile alphabetisch sortiert werden soll.

    Das gewünschte Ergebnis wäre:
    H I N
    Ü M N
    E Z

    Vielen Dank für Eure Hilfe!

    PS: Mir ist klar, dass man dieses Beispiel auch mit

    [autoit]

    _ArraySwap()

    [/autoit]

    lösen könnte, ich bin jedoch an einer allgemeinen Lösung interessiert.

  • Hier habe ich mal einen kleinen Ansatz.
    Allerdings wird da immer eine Spalte verdoppelt...
    Muss ich mal noch schauen wie ich das beheben kann.

    €dit: Hab ihn gerade gefunden.
    Der Fehler lag in Zeile 42.
    Dort hatte ich folgendes stehen: "If $iCountThree = UBound($aiNumber) - 1 Then ExitLoop(2)"
    (Die -1 nach dem UBound muss natürlich weg...)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $iCountOne, $avOrder[26], $avInput[10][5], $iCountTwo

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; Füllt das Array $avOrder mit den Buchstaben A bis Z.
    For $iCountOne = 0 To UBound($avOrder) - 1
    $avOrder[$iCountOne] = Chr($iCountOne + 65)
    Next

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

    ; Füllt das Array $avInput mit zufälligen Buchstaben von A bis Z.
    For $iCountOne = 0 To UBound($avInput) - 1
    For $iCountTwo = 0 To UBound($avInput, 2) - 1
    $avInput[$iCountOne][$iCountTwo] = Chr(Random(65, 90, 1))
    Next
    Next

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

    _ArrayDisplay($avInput, '$avInput - Vor der Sortierung')
    _ArraySortColumn($avInput, $avOrder)
    _ArrayDisplay($avInput, '$avInput - Nach der Sortierung')

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; $avInput >> Das zu sortierende Array.
    ; $avOrder >> Array mit der Reihenfolge der zu sortierenden Zeichen.
    Func _ArraySortColumn(ByRef $avInput, $avOrder)
    Local $avCopy = $avInput
    Local $aiNumber[UBound($avInput, 2)]
    Local $iCountOne, $iCountTwo, $iCountThree

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

    For $iCountOne = 0 To UBound($avOrder) - 1
    For $iCountTwo = 0 To UBound($avCopy, 2) - 1
    If $avCopy[0][$iCountTwo] = $avOrder[$iCountOne] Then
    $aiNumber[$iCountThree] = $iCountTwo
    $iCountThree += 1
    If $iCountThree = UBound($aiNumber) Then ExitLoop(2)
    EndIf
    Next
    Next

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

    For $iCountOne = 0 To UBound($avCopy, 2) - 1
    For $iCountTwo = 0 To UBound($avCopy) - 1
    $avInput[$iCountTwo][$iCountOne] = $avCopy[$iCountTwo][$aiNumber[$iCountOne]]
    Next
    Next
    EndFunc

    [/autoit]
  • Code mässig etwas kürzer:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    Global $aArray[3][3]
    $aArray[0][0] = 'I'
    $aArray[0][1] = 'H'
    $aArray[0][2] = 'N'
    $aArray[1][0] = 'M'
    $aArray[1][1] = 'Ü'
    $aArray[1][2] = 'N'
    $aArray[2][0] = 'Z'
    $aArray[2][1] = 'E'
    $aArray[2][2] = ''

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

    $aArray = _Transpose($aArray)
    _ArraySort($aArray)
    $aArray = _Transpose($aArray)
    _ArrayDisplay($aArray, 'Ergebnis')

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

    Func _Transpose($aArray)
    ;Autor autoBert
    Local $iCols = UBound($aArray, 2)
    Local $iRows = UBound($aArray)
    Local $aResult[$iCols][$iRows]
    For $i = 0 To $iCols - 1
    For $j = 0 To $iRows - 1
    $aResult[$j][$i] = $aArray[$i][$j]
    Next
    Next
    Return $aResult
    EndFunc ;==>_Transpose

    [/autoit]

    mfg autoBert