Array sortieren nach Anzahl gleicher Einträge

    • Offizieller Beitrag

    Hi,
    mal wieder Zeit für eine neue Array-Funktion. :D

    Wenn ein Array in einer Spalte mehrfach gleiche Werte enthält (z.B. Datum, IP-Nr), so läßt sich hiermit nach der Anzahl gleicher Werte sortieren.

    _Array2DSortByCountSameEntries(ByRef $ARRAY [, $iCol=0 [, $DESCENDING=1]])

    Sortiert ein Array nach der Anzahl gleicher Einträge, bei 2D-Array nach Anzahl gleicher Einträge einer angegebenen Spalte.
    Wahlweise Sortierung nach fallender (Standard) oder steigender Anzahl gleicher Elemente.
    Erfordert die Funktion: _ArraySort_2ary()

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Dim $AR[10]=['a','a','a','b','b','c','e','e','e','e']
    Dim $AR2[10][3]
    $AR2[0][0] = 1
    $AR2[1][0] = 2
    $AR2[2][0] = 3
    $AR2[3][0] = 4
    $AR2[4][0] = 5
    $AR2[5][0] = 6
    $AR2[6][0] = 7
    $AR2[7][0] = 8
    $AR2[8][0] = 9
    $AR2[9][0] = 10

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

    $AR2[0][1] = 'a'
    $AR2[1][1] = 'a'
    $AR2[2][1] = 'x'
    $AR2[3][1] = 'b'
    $AR2[4][1] = 'c'
    $AR2[5][1] = 'c'
    $AR2[6][1] = 'e'
    $AR2[7][1] = 'e'
    $AR2[8][1] = 'e'
    $AR2[9][1] = 'e'

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

    $AR2[0][2] = 'X'
    $AR2[1][2] = 'X'
    $AR2[2][2] = 'A'
    $AR2[3][2] = 'A'
    $AR2[4][2] = 'B'
    $AR2[5][2] = 'B'
    $AR2[6][2] = 'B'
    $AR2[7][2] = 'D'
    $AR2[8][2] = 'F'
    $AR2[9][2] = 'F'

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

    _ArrayDisplay($AR, '1D - unsortiert')
    _Array2DSortByCountSameEntrys($AR)
    _ArrayDisplay($AR, '1D - sortiert nach Anzahl gleicher Einträge; fallend')

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

    _ArrayDisplay($AR2, '2D - unsortiert')
    _Array2DSortByCountSameEntrys($AR2,2,0)
    _ArrayDisplay($AR2, '2D - sortiert nach Anzahl gleicher Einträge in Col 2; steigend')

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _Array2DSortByCountSameEntries(ByRef $ARRAY [, $iCol=0 [, $DESCENDING=1]])
    ;
    ; Description - Sorts an 1D/2D Array by count of same entries (2D - in a given column)
    ; - Count de- or ascending
    ;
    ; Parameter $ARRAY: Array to sort
    ; optional $iCol: Column with same entries to sort (default 0)
    ; optional $DESCENDING: Sort ascending[0]/descending[1] (default 1)
    ;
    ; Return Success -1 sorted array
    ; Failure 0 @error = 1, given array is not array
    ;
    ; Requirements _ArraySort_2ary() with #include <array.au3>
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DSortByCountSameEntries(ByRef $ARRAY, $iCol=0, $DESCENDING=1)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    If $DESCENDING <> 1 Then $DESCENDING = 0
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then ; 1D
    Dim $aTMP[UBound($ARRAY)][2]
    For $i = 0 To UBound($ARRAY)-1
    $aTMP[$i][0] = 1
    $aTMP[$i][1] = $ARRAY[$i]
    Next
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If ($i > 0) And ($i < UBound($ARRAY)-1) Then
    If $ARRAY[$i] <> $aTMP[$k][1] Then
    For $x = $k To $i-1
    $aTMP[$x][0] = $i-$k
    Next
    $k = $i
    EndIf
    ElseIf $i = UBound($ARRAY)-1 Then
    If $ARRAY[$i] <> $aTMP[$k][1] Then
    For $x = $k To $i-1
    $aTMP[$x][0] = $i-$k
    Next
    $k = $i
    Else
    For $x = $k To $i
    $aTMP[$x][0] = $i-$k+1
    Next
    EndIf
    EndIf
    Next
    _ArraySort_2ary($aTMP, 0, $iCol, $DESCENDING)
    For $i = 0 To UBound($ARRAY)-1
    $ARRAY[$i] = $aTMP[$i][1]
    Next
    Else ; 2D
    Dim $aTMP = $ARRAY
    ReDim $aTMP[UBound($ARRAY)][$UBound2nd+1]
    For $i = 0 To UBound($ARRAY)-1
    $aTMP[$i][$UBound2nd] = 1
    Next
    $k = 0
    For $i = 0 To UBound($ARRAY)-1
    If ($i > 0) And ($i < UBound($ARRAY)-1) Then
    If $ARRAY[$i][$iCol] <> $aTMP[$k][$iCol] Then
    For $x = $k To $i-1
    $aTMP[$x][$UBound2nd] = $i-$k
    Next
    $k = $i
    EndIf
    ElseIf $i = UBound($ARRAY)-1 Then
    If $ARRAY[$i][$iCol] <> $aTMP[$k][$iCol] Then
    For $x = $k To $i-1
    $aTMP[$x][$UBound2nd] = $i-$k
    Next
    $k = $i
    Else
    For $x = $k To $i
    $aTMP[$x][$UBound2nd] = $i-$k+1
    Next
    EndIf
    EndIf
    Next
    _ArraySort_2ary($aTMP, $UBound2nd, $iCol, $DESCENDING)
    For $i = 0 To UBound($ARRAY)-1
    For $k = 0 To $UBound2nd-1
    $ARRAY[$i][$k] = $aTMP[$i][$k]
    Next
    Next
    EndIf
    Return -1
    EndFunc ;_Array2DSortByCountSameEntries

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

    Func _ArraySort_2ary(ByRef $ARRAY, $DIM_1ST=0, $DIM_2ND=1, $DESCENDING=0, $REVERSE=False)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    SetError(2)
    Return 0
    EndIf
    If $DIM_1ST <> 0 Then $DIM_1ST = $UBound2nd-1
    Local $arTmp[1][$UBound2nd]
    _ArraySort($ARRAY,$DESCENDING,0,0,$UBound2nd,$DIM_1ST)
    If $REVERSE Then
    Switch $DESCENDING
    Case 0
    $DESCENDING = 1
    Case 1
    $DESCENDING = 0
    EndSwitch
    EndIf
    For $u = 0 To $UBound2nd-1
    For $i = 0 To UBound($ARRAY)-1
    If $sortYES = 0 Then
    If $u > 0 Then
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) And _
    ( $ARRAY[$i][$u-1] = $ARRAY[$i+1][$u-1] )Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    Else
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    EndIf
    ElseIf $sortYES = 1 Then
    If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$u] <> $ARRAY[$i+1][$u] ) Then
    $sortYES = 0
    $LAST = $i +1
    ReDim $arTmp[$LAST-$FIRST][$UBound2nd]
    $tmpFIRST = $FIRST
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$tmpFIRST][$l]
    Next
    $tmpFIRST += 1
    Next
    $tmpFIRST = $FIRST
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$DIM_2ND)
    For $k = 0 To UBound($arTmp)-1
    For $l = 1 To $UBound2nd-1
    $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
    Next
    $tmpFIRST += 1
    Next
    EndIf
    EndIf
    Next
    $sortYES = 0
    Next
    Return -1
    EndFunc ;==>_ArraySort_2ary

    [/autoit]