Numerischen Wert an bestimmte Stelle im Array einfügen

  • Hallo

    Ich habe ein Array, dessen maximal 10 Werte (sind alle Integer) ich aus einer .ini einlese. Die Datei kann z. B. so aussehen:


    Werte im Array speichern:

    [autoit]

    For $i = 1 To 10
    $arrayScore[$i] = IniRead($highScoresFile, "Scores", $i, "")
    Next

    [/autoit]

    Jetzt habe ich einen Wert $wert, den ich in das Array einfügen will.

    Beispielsweise ist dieser 5000, d.h. er soll mit den anderen Werten aus dem Array verglichen und an die entsprechende Stelle, in diesem Fall bei dem key 5, eingefügt werden.

    Alle Werte, die kleiner als $wert sind, sollen nach unten verschoben bzw. der Wert des keys 10 (der an Stelle 11 rücken würde) gelöscht werden.

    Ich weiß leider nicht wie ich das bewerkstelligen soll.

    Hier ist noch ein kurzer Code, der einen Ausschnitt meines erbärmlichen Versuches darstellt :P

    [autoit]

    Global $highScoreTempArray[10]

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

    $index = _ArrayMaxIndex($arrayScore, 1, 1)

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

    If $index < 10 Then
    For $i = $index To 10
    $highScoreTempArray[$i] = IniRead($highScoresFile, "Scores", $i, "")
    IniWrite($highScoresFile, "Scores", $i+1, $highScoreTempArray[$i])
    Next
    EndIf

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

    IniWrite($highScoresFile, "Scores", $index, $wert)

    [/autoit]


    Ich würde mich über Antworten freuen

    Einmal editiert, zuletzt von pete_gzome (8. März 2012 um 20:22)

  • Mit Hilfe der Funktion _Array2DInsertvon BugFix.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $iNewScore = 5000

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

    $aIni = IniReadSection("Highscores.ini", "Scores")
    _ArrayDisplay($aIni)
    For $i = 1 To $aIni[0][0]
    If $iNewScore > Int($aIni[$i][1]) Then
    _Array2DInsert($aIni, $i, $i & "|" & $iNewScore)
    ExitLoop
    EndIf
    Next

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

    For $i = 1 To $aIni[0][0]
    $aIni[$i][0] = $i
    Next

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

    _ArrayDelete($aIni, 11)
    _ArrayDisplay($aIni)
    IniWriteSection("Highscores.ini", "Scores", $aIni)

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

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;
    ; Function _Array2DInsert(ByRef $avArray, $iElement [, $sValue=''])
    ;
    ; Description Insert an Array element on a given position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; $iElement 0-based Array Index, to insert new Element
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes the given Array with new Element
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ; @error = 3 $iElement larger then Ubound
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func _Array2DInsert(ByRef $avArray, $iElement, $sValue='')
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    Local $arTMP[UBound($avArray)+1]
    If $iElement > UBound($avArray) Then
    SetError(3)
    Return 0
    EndIf
    For $i = 0 To UBound($arTMP)-1
    If $i < $iElement Then
    $arTMP[$i] = $avArray[$i]
    ElseIf $i = $iElement Then
    If $i < UBound($avArray) Then
    $arTMP[$i] = $sValue
    $arTMP[$i+1] = $avArray[$i]
    Else
    $arTMP[$i] = $sValue
    EndIf
    ElseIf ($i > $iElement) And ($i < UBound($avArray))Then
    $arTMP[$i+1] = $avArray[$i]
    EndIf
    Next
    Else
    Local $arTMP[UBound($avArray)+1][$UBound2nd], $arValue
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    If $iElement > UBound($avArray) Then
    SetError(3)
    Return 0
    EndIf
    For $i = 0 To UBound($arTMP)-1
    If $i < $iElement Then
    For $k = 0 To $UBound2nd-1
    $arTMP[$i][$k] = $avArray[$i][$k]
    Next
    ElseIf $i = $iElement Then
    If $i < UBound($avArray) Then
    For $k = 0 To $UBound2nd-1
    $arTMP[$i][$k] = $arValue[$k+1]
    $arTMP[$i+1][$k] = $avArray[$i][$k]
    Next
    Else
    For $k = 0 To $UBound2nd-1
    $arTMP[$i][$k] = $arValue[$k+1]
    Next
    EndIf
    ElseIf ($i > $iElement) And ($i < UBound($avArray))Then
    For $k = 0 To $UBound2nd-1
    $arTMP[$i+1][$k] = $avArray[$i][$k]
    Next
    EndIf
    Next
    EndIf
    $avArray = $arTMP
    EndFunc ;==>_Array2DInsert

    [/autoit]
  • Achja, hatte vergessen das _ArraySort auch 2D-Arrays sortiert. Stimmt so wäre es besser.

  • Danke für die Antworten. Es ist doch noch etwas komplizierter geworden.

    In der INI stehen nämlich noch unter der section "Names" nach dem gleichen Aufbau wie "Scores" die Namen zu den entsprechenden Werten.

    Das Problem ist bei deinem Vorschlag BugFix, dass ich den eingefügten Wert $value nicht tracken kann (oder ich nicht weiß wie), weil ich ihn einfach einfüge und das Array sortiere, und nicht mit den anderen Werten vergleiche und die Position, an die er eingefügt werden soll, speichere.

    Ich habe mir jetzt etwas gebastelt, das soweit ich es sehe funktioniert:

    Die Werte aus der INI werden in einem Array gespeichert. Dann wird der einzufügende Wert mit den gespeicherten Werten verglichen, angefangen bei dem größten. Wenn der Wert größer als der verglichene Wert aus dem Array ist, werden alle Werte, die noch folgen, mit dem jeweils vorhergehenden Wert überschrieben. Am Ende wird der Wert an die Position eingefügt, die der verglichene Wert, der kleiner als der zu vergleichende Wert ist aber größer als alle anderen Werte aus dem Array, hatte.

    [autoit]

    Global $arrayTemp[10]
    Global $iniArray[10] ; hier sind die Werte aus der ini drin

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

    For $i = 0 To 9
    $arrayTemp[$i] = $iniArray[$i]
    Next

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

    For $i = 0 To 9
    If $value > $arrayTemp[$i] Then
    $key = $i
    For $j = 9 To $i+1 Step -1
    $arrayTemp[$j] = $arrayTemp[$j-1]
    Next
    $arrayTemp[$i] = $value
    ExitLoop
    Else
    EndIf
    Next

    [/autoit]

    Damit habe ich sofort den Key $key, mit dessen Hilfe ich dann ganz einfach den entsprechenden Namen in die ini and die richtige Position schreiben kann.

    Nochmals danke! Gelöst

    2 Mal editiert, zuletzt von pete_gzome (8. März 2012 um 20:27)