Beiträge von triple81
-
-
Hallo Leute,
ich versuche ein 2D array nach 2 Spalten (Runden und Fahrzeit) zu sortieren.
Das array muss zuerst nach Runden absteigend und anschliessend nach Fahrzeit aufsteigend sortiert werden.
(Eine ganz normale Rennergebnisausgabe sortiert nach Platzierung)Leider bekomme ich nicht immer das gewünschte Ergebnis in meiner Funktion.
Gibt es da villt doch eine bereits fertige Funktion für?Vielleicht kann ja mal jemand einen Blick auf meine werfen?
Gruß triple
[autoit]
[/autoit][autoit][/autoit][autoit]
; Include
#include <array.au3>; Declare
[/autoit][autoit][/autoit][autoit]
Global $array[4][4]$array[0][0] = "KartNo"
[/autoit][autoit][/autoit][autoit]
$array[0][1] = "Laps"
$array[0][2] = "Time"
$array[0][3] = "Handle"$array[1][0] = "Kart 1"
[/autoit][autoit][/autoit][autoit]
$array[1][1] = 2
$array[1][2] = 90
$array[1][3] = $array[1][0] & "-" & $array[1][1] & "-" & $array[1][2]$array[2][0] = "Kart 2"
[/autoit][autoit][/autoit][autoit]
$array[2][1] = 2
$array[2][2] = 94
$array[2][3] = $array[2][0] & "-" & $array[2][1] & "-" & $array[2][2]$array[3][0] = "Kart 3"
[/autoit][autoit][/autoit][autoit]
$array[3][1] = 1
$array[3][2] = 56
$array[3][3] = $array[3][0] & "-" & $array[3][1] & "-" & $array[3][2]_ArrayDisplay($array, "Unsortiert")
[/autoit][autoit][/autoit][autoit]
_ArrayDelete($array, 0); Sortieren (Runden absteigend, Fahrzeit aufsteigend)
[/autoit][autoit][/autoit][autoit]
$bench_start = TimerInit()
$Result = xd_Sort_Numeric_2D_Array($array, 1, 2)
$bench_end = Round(TimerDiff($bench_start), 2)ConsoleWrite("Laufzeit: " & $bench_end & " ms" & @CRLF)
[/autoit][autoit][/autoit][autoit]
ConsoleWrite("Errorcode: " & $Result & @CRLF)_ArrayDisplay($array, "Sortiert")
[/autoit][autoit][/autoit][autoit]Exit
[/autoit][autoit][/autoit][autoit]; --------------------------------------------------------------------------------------------------------------------------------------------
[/autoit][autoit][/autoit][autoit]
; Sortiere numerisches 2D Array nach 2 Kriterien (unterschiedlich, auf sowie absteigend)
; --------------------------------------------------------------------------------------------------------------------------------------------
Func xd_Sort_Numeric_2D_Array(ByRef $arr_Array, Const $int_ColPrim, Const $int_ColSec, Const $bol_SortPrimDesc = True, Const $bol_SortSecDesc = False); Declare
[/autoit][autoit][/autoit][autoit]
Local $int_PrimSortDirection, $int_SecSortDirection, $int_ArrayColumns, $int_Start, $int_End; Validierung
[/autoit][autoit][/autoit][autoit]
If Not IsArray($arr_Array) Then SetError(1, 0, False)
If Not Ubound($arr_Array, 0) <> 2 Then SetError(2, 0, False)
If $int_ColPrim < 0 Then SetError(3, 0, False)
If $int_ColSec < 0 Then SetError(4, 0, False)
If $int_ColPrim = $int_ColSec Then SetError(5, 0, False)
If $bol_SortPrimDesc <> True AND $bol_SortPrimDesc <> False Then SetError(6, 0, False)
If $bol_SortSecDesc <> True AND $bol_SortSecDesc <> False Then SetError(7, 0, False); Set values
[/autoit][autoit][/autoit][autoit]
$int_PrimSortDirection = 1
$int_SecSortDirection = 1
$int_ArrayColumns = UBound($arr_Array, 2)
$int_Start = 0
$int_End = Ubound($arr_Array)-1; Sortierrichtung festlegen (True=ASC, False=DESC)
[/autoit][autoit][/autoit][autoit]
If $bol_SortPrimDesc = True Then $int_PrimSortDirection = -1
If $bol_SortSecDesc = True Then $int_SecSortDirection = -1; Sortier sowie Out-Arrays erstellen
[/autoit][autoit][/autoit][autoit]
Local $arr_Out_Array[$int_End - $int_Start + 1][$int_ArrayColumns]
Local $arr_Sort1_Array = $arr_Array
Local $arr_Sort2_Array = $arr_Array; Arrays nach Primärspalte / Sekundärspalte sortieren (Richtung wird beachtet)
[/autoit][autoit][/autoit][autoit]
__ArrayQuickSort2D($arr_Sort1_Array, $int_PrimSortDirection, $int_Start, $int_End, $int_ColPrim, UBound($arr_Array, 2)-1)
__ArrayQuickSort2D($arr_Sort2_Array, $int_SecSortDirection, $int_Start, $int_End, $int_ColSec, UBound($arr_Array, 2)-1)_ArrayDisplay($arr_Sort1_Array, "Sortiert nach Laps")
[/autoit][autoit][/autoit][autoit]
_ArrayDisplay($arr_Sort2_Array, "Sortiert nach Zeit"); ------------------------------------------------------------------------------
[/autoit][autoit][/autoit][autoit]
; Array 1 durchlaufen und sortierte Primarys mit Array 2 vergleichen und setzen
; ------------------------------------------------------------------------------
Local $int_x = 0
While $int_x < Ubound($arr_Array); Primary aus Array-1 holen
[/autoit][autoit][/autoit][autoit]
Local $Primary_x = $arr_Sort1_Array[$int_x][$int_ColPrim]; Alle mit gleichem Primary aus Array-2 holen
[/autoit][autoit][/autoit][autoit]
; ------------------------------------------------------------------------
For $int_y = 0 To $int_End Step 1; Primary´s vergleichen und bei gleichen Werten setzen
[/autoit][autoit][/autoit][autoit]
If $Primary_x = $arr_Sort2_Array[$int_y][$int_ColPrim] Then; Alle Spalten zum setzen der Zeilendaten durchlaufen
[/autoit][autoit][/autoit][autoit]
For $int_z = 0 To $int_ArrayColumns-1 Step 1
$arr_Out_Array[$int_x][$int_z] = $arr_Sort2_Array[$int_y][$int_z]
Next_ArrayDisplay($arr_Out_Array, "1 - x:" & $int_x & " y:" & $int_y)
[/autoit][autoit][/autoit][autoit]$int_x += 1
[/autoit][autoit][/autoit][autoit]If $int_x = Ubound($arr_Array) Then ExitLoop
[/autoit][autoit][/autoit][autoit]; Primary nicht gleich (setzen und y_loop abbrechen)
[/autoit][autoit][/autoit][autoit]
; ------------------------------------------------------------------------
ElseFor $int_z = 0 To $int_ArrayColumns-1 Step 1
[/autoit][autoit][/autoit][autoit]
$arr_Out_Array[$int_x][$int_z] = $arr_Sort1_Array[$int_x][$int_z]
Next$int_x += 1
[/autoit][autoit][/autoit][autoit]
ExitLoopEndIf
[/autoit][autoit][/autoit][autoit]Next
[/autoit][autoit][/autoit][autoit]
; ------------------------------------------------------------------------WEnd
[/autoit][autoit][/autoit][autoit]; Return setzen (ByRef array)
[/autoit][autoit][/autoit][autoit]
$arr_Array = $arr_Out_ArrayEndFunc
[/autoit]