Zweidimensionales Array filtern und berechnen

  • Servus zusammen,

    leider hat mir google bei meinem Problem nicht helfen können, drum setz ich meine Hoffnungen auf euch :)

    Ich habe ein zweidimensionales Array was folgendermaßen aufgebaut ist:

    A 0
    A 345
    B 52
    B 6676
    A 2
    B 0
    B 0
    A 656

    usw .. jetzt möchte ich das Array filtern und berechnen. Zu Deutsch am Ende soll eine Summe für A und eine für B rauskommen. Im Beispiel wäre das 1003 für A und 6728 für B. Wie realisiert man sowas?
    (Anders ausgedrückt, ich möchte mein Array ähnlich wie eine Tabelle behandeln.)

    Vielen Dank und viele Grüße
    Benny

  • So?

    Spoiler anzeigen
    [autoit]

    For $i = 0 To UBound($array) - 1
    If $array[$i][0] == 'A' Then
    $a += $array[$i][1]
    Else
    $b += $array[$i][1]
    EndIf
    Next

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

    ConsoleWrite(@CRLF & "A: " & $a & @CRLF & "B: " & $b & @CRLF)

    [/autoit]


    Gruss Shadowigor

  • Hier noch ein Ansatz der mit x-beliebig vielen zu summierenden "Spalten" funtioniert:

    Spoiler anzeigen
    [autoit]

    ;#include <array.au3>
    #include <File.au3>
    #include <arraySort2D_MC.au3>

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

    Global $aFile

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

    _FileReadToArray(@ScriptDir & "\2dSum.txt", $aFile)
    _ArrayDisplay($aFile)
    Global $a2D[$aFile[0]][2]
    _ArrayDelete($aFile, 0)
    For $i = 0 To UBound($aFile) - 1
    $aSplit = StringSplit($aFile[$i], " ",2)
    $a2D[$i][0] = $aSplit[0]
    $a2D[$i][1] = $aSplit[1]
    Next
    _ArrayDisplay($a2D, "2D unsortiert")

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

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

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

    ;Summierung
    $aRes = _ArraySum2D($a2D)
    _ArrayDisplay($aRes,"Summen")
    Func _ArraySum2D(ByRef $avArray)
    Local $sActCol, $iActCol=-1, $sRes, $iRes,$aRes[2][UBound($avArray)]
    For $i = 0 To UBound($avArray) - 1
    If $sActCol <> $avArray[$i][0] Then ;Spaltenwechsel
    $iActCol +=1
    $aRes[0][$iActCol] = $avArray[$i][0]
    $sActCol = $avArray[$i][0]
    EndIf
    $aRes[1][$iActCol] += $avArray[$i][1]
    Next
    ReDim $aRes[2][$iActCol+1]
    Return $aRes
    EndFunc ;==>_ArraySum2D

    [/autoit]

    benötigt wird dazu noch die UDF zum 2D-Arrays zu sortieren aus meiner Signatur.

    Und noch eine Lösung die ohe diese UDF auskommt:

    Spoiler anzeigen
    [autoit]

    ;#include <array.au3>
    #include <File.au3>
    #include <array.au3>

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

    Global $aFile

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

    _FileReadToArray(@ScriptDir & "\2dSum.txt", $aFile)
    ;_ArrayDisplay($aFile)
    Global $a2D[$aFile[0]][2]
    _ArrayDelete($aFile, 0)
    For $i = 0 To UBound($aFile) - 1
    $aSplit = StringSplit($aFile[$i], " ", 2)
    $a2D[$i][0] = $aSplit[0]
    $a2D[$i][1] = $aSplit[1]
    Next

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

    ;Summierung
    $aRes = _ArraySum2D($a2D)
    _ArrayDisplay($aRes, "Summen")

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

    Func _ArraySum2D(ByRef $avArray)
    Local $sActCol, $iActCol = -1, $sRes, $iRes
    Local $aTmp = _ArrayUnique($avArray)
    _ArrayDelete($aTmp, 0)
    _ArraySort($aTmp)
    Local $aRes[2][UBound($aTmp)]
    For $i = 0 To UBound($aTmp) - 1
    $aRes[0][$i] = $aTmp[$i]
    Next
    For $i = 0 To UBound($avArray) - 1
    For $j = 0 To UBound($aRes,2)-1
    ConsoleWrite($avArray[$i][0]&@TAB&$avArray[$i][1]&@CRLF)
    If $aRes[0][$j] = $avArray[$i][0] Then $aRes[1][$j] += $avArray[$i][1]
    Next
    Next
    Return $aRes
    EndFunc ;==>_ArraySum2D

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

    Diese ist bei wenigen auf zu addierenden "Spalten" schneller:

    Spoiler anzeigen
    [autoit]

    ;#include <array.au3>
    #include <File.au3>
    #include <array.au3>

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

    Global $aFile

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

    _FileReadToArray(@ScriptDir & "\2dSum.txt", $aFile)
    ;_ArrayDisplay($aFile)
    Global $a2D[$aFile[0]][2]
    _ArrayDelete($aFile, 0)
    For $i = 0 To UBound($aFile) - 1
    $aSplit = StringSplit($aFile[$i], " ", 2)
    $a2D[$i][0] = $aSplit[0]
    $a2D[$i][1] = $aSplit[1]
    Next

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

    ;Summierung
    $aRes = _ArraySum2D($a2D)
    _ArrayDisplay($aRes, "Summen")

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

    Func _ArraySum2D(ByRef $avArray)
    Local $sActCol, $iActCol = -1, $sRes, $iRes
    Local $aTmp = _ArrayUnique($avArray)
    _ArrayDelete($aTmp, 0)
    _ArraySort($aTmp)
    Local $aRes[2][UBound($aTmp)]
    For $i = 0 To UBound($aTmp) - 1
    $aRes[0][$i] = $aTmp[$i]
    Next
    For $i = 0 To UBound($avArray) - 1
    For $j = 0 To UBound($aRes,2)-1
    ConsoleWrite($avArray[$i][0]&@TAB&$avArray[$i][1]&@CRLF)
    If $aRes[0][$j] = $avArray[$i][0] Then $aRes[1][$j] += $avArray[$i][1]
    Next
    Next
    Return $aRes
    EndFunc ;==>_ArraySum2D

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

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (21. November 2012 um 20:05)