_ArraySort problem

  • und zwar wird eine textdatei in ein array eingelesen
    der inhalt dieser textdatei sieht in etwa so aus:

    das sortierte array sieht dann so aus:



    Es soll aber so Aussehen:


    Hier der entsprechende Teil aus meinem script:

    Spoiler anzeigen
    [autoit]

    ;----------------------Serverconfig Auslesen----------------------------
    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
    $mainwindow = GuiCreate("Select Map config", 200, 65) ; GUI erstellen
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $combo = GuiCtrlCreatecombo("", 20, 5, 160, 80) ;Combo-Box erstellen
    _GUICtrlComboBox_BeginUpdate($combo) ; Add files
    _GUICtrlComboBox_AddDir($combo, "ServerData" & "\*.txt")
    _GUICtrlComboBox_EndUpdate($combo)
    $okbutton = GUICtrlCreateButton("OK", 70, 35, 60) ; "OK" Button erstellen
    GUICtrlSetOnEvent($okbutton, "OKButton") ; "OK" Button Event
    GUISetState(@SW_SHOW) ; Fenster anzeigen

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

    While 1
    Sleep(1000) ; Idle around
    If $once = True Then ExitLoop
    WEnd

    $datei = "ServerData\" & GUICtrlRead ($combo)
    ConsoleWrite (@CRLF & "$datei = " & $datei); DEBUG
    $anzzeilen = _FileCountLines ($datei)
    For $i = 1 To $anzzeilen
    $s = FileReadLine ($datei,$i)
    _ArrayAdd ($array_srvcfg, $s)
    Next
    ;~ _ArrayDisplay ($array)
    $find = _ArraySearch ($array_srvcfg, "GameType", 0, 0, 0, True) ; entsprechenden Berreich das gametüpes in der config finden
    $gametype = _ArrayToString ($array_srvcfg,0,$find,$find)

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

    If $gametype = "GameType = 2" Then ; Aktueller Spielemodus Erkennen
    $TDMstart = _ArraySearch ($array_srvcfg, "[TeamDeathmatch]", 0, 0, 0, False) ; Startpunkt des auslesens
    $TDMend = _ArraySearch ($array_srvcfg, "TimeLimit", 0, 0, 0, True) ; Endpunkt des auslesens

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

    For $i2 = $TDMstart to $TDMend ; Anzahl der auszulesenden Zeilen
    $s2 = FileReadLine ($datei,$i2) ; Textdatei auslesen
    _ArrayAdd ( $TDM, $s2) ; Array mit Daten füllnen
    Next
    _ArraySort ($TDM) ; Array Sortieren
    _Array2DEmptyDel ($TDM)
    _ArrayDelete ($TDM, "[TeamDeathmatch]") ; "[TeamDeathmatch]" aus Array entfernen
    _ArrayTrim($TDM, 25, 0) ; Map-Pfade entfernen, so dass nur noch der reine Mapname dasteht
    _ArrayTrim($TDM, 1, 1) ; ausführungszeichen am ande entfernen
    EndIf
    ConsoleWrite (@CRLF & "zeilenanzahl = " & $i2) ;DEBUG

    [/autoit]

    Einmal editiert, zuletzt von hofi02 (4. Juli 2008 um 14:36)

  • nein es soll halt von 0 bis 128 sortiert werden in richtiger reihenfolge

    er unterschied liegt darin:

    Map08
    Map09
    Map10
    (dann geht es plötzlich bei 100 weiter)
    Map100
    Map101
    usw ..

    es soll aber
    Map08
    Map09
    Map10
    Map11
    Map12
    ...
    Map98
    Map99
    Map100
    Map101

  • Vielleicht hilft es als Beispiel wie man es machen könnte:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <array.au3>
    #include <WindowsConstants.au3>

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

    Dim $arr[201] ;<-- Test Array

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

    ;<-- Array befüllen
    For $int = 0 to 200
    Do
    $x = Random(0,200,1)
    If $x < 10 Then
    $strX = '0' & string($x)
    Else
    $strX = string($x)
    EndIf
    $str = StringFormat("Map%s - XXXXXX",$strX)
    Until _ArraySearch($arr,$str) = -1
    $arr[$int] = $str
    Next
    ;--> Array befüllen

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

    _ArrayDisplay($arr) ;<-- Array anzeigen

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

    ;<-- Mit 0 auffüllen
    For $int = 0 to UBound($arr) -1
    If StringInStr($arr[$int],' ') = 6 Then $arr[$int] = StringReplace($arr[$int],'Map','Map0')
    Next
    ;--> Mit 0 auffüllen

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

    _ArraySort($arr) ;<-- Array sortieren

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

    _ArrayDisplay($arr) ;<-- Array anzeigen

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

    ;<-- 0 entfernen
    For $int = 0 to UBound($arr) -1
    $arr[$int] = StringReplace($arr[$int],'Map0','Map')
    Next
    ;--> 0 entfernen

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

    _ArrayDisplay($arr) ;<-- Array anzeigen

    [/autoit]

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    • Offizieller Beitrag

    Hier mal ein schneller Versuch:

    [autoit]

    #include <Array.au3>
    Global $test_A[15] = ['Map1', 'Map2', 'Map100', 'Map101', 'Map102', 'Map3', 'Map4', 'Map5', 'Map6', 'Map7', 'Map8', 'Map9', 'Map10', 'Map11', 'Map12']

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

    $re = _sortNummeric($test_A)

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

    _ArrayDisplay($re)

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

    Func _sortNummeric(ByRef $array)
    Local $t_A[UBound($array)][2], $re_A[UBound($array)]
    For $i = 0 To UBound($array) - 1
    $t_A[$i][0] = Int(StringRegExpReplace($array[$i], '[^0-9]', ''))
    $t_A[$i][1] = $array[$i]
    Next
    _ArraySort($t_A, 0, 0, 0, 0)
    For $i = 0 To UBound($array) - 1
    $re_A[$i] = $t_A[$i][1]
    Next
    Return $re_A
    EndFunc ;==>_sortNummeric

    [/autoit]

    Mega

  • Das übliche Sortierproblem. Mach halt folgendes z.B.:

    Erst die Map-Nummer extrahieren, diese und den eigentlichen Text ein neues Array schreiben und dieses dann nach der "Spalte" mit den Nummern sortieren.

    Spoiler anzeigen
    [autoit]

    #region Includes
    #include <Array.au3>
    #endregion Includes
    dim $ar[17]
    dim $sort[17][2]

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

    $ar[0] = 'Map12 = "worlds\multi\dm\dm_bw.cargo"'
    $ar[1] = 'Map09 = "worlds\multi\dm\dm_overwatch"'
    $ar[2] = 'Map05 = "worlds\multi\dm\dm_industry"'
    $ar[3] = 'Map01 = "worlds\multi\dm\rc_devils_reach_station_v1_4f"'
    $ar[4] = 'Map07 = "worlds\multi\dm\dm_infestation"'
    $ar[5] = 'Map03 = "worlds\multi\dm\dm_industry2"'
    $ar[6] = 'Map04 = "worlds\multi\dm\dark_temples"'
    $ar[7] = 'Map02 = "worlds\multi\dm\pitchblack"'
    $ar[8] = 'Map00 = "worlds\multi\dm\sw_tatooine"'
    $ar[9] = 'Map06 = "worlds\multi\dm\dm_aizin"'
    $ar[10] = 'Map10 = "worlds\multi\dm\dm_bw.battlecruiser"'
    $ar[11] = 'Map08 = "worlds\multi\dm\dm_backstreets_v1-2"'
    $ar[12] = 'Map11 = "worlds\multi\dm\dm_steam"'
    $ar[13] = 'Map100 = "worlds\multi\dm\dm_westend"'
    $ar[14] = 'Map101 = "worlds\multi\dm\dm_zebra1"'
    $ar[15] = 'Map102 = "worlds\multi\dm\lab_tox"'
    $ar[16] = 'Map103 = "worlds\multi\dm\dm_bw..rust"'

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

    For $i = 0 To Ubound($ar) -1
    $aNum =StringRegExp($ar[$i],"Map([\d]*)",1)
    If Not @error And IsArray($aNum) Then
    $sort[$i][0] = Int($aNum[0])
    $sort[$i][1] = $ar[$i]
    EndIf
    Next
    _ArrayDisplay($sort)

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

    _ArraySort($sort)

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

    _ArrayDisplay($sort)

    [/autoit]