- Offizieller Beitrag
Hi,
mal wieder Zeit für eine neue Array-Funktion.
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
#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
$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'
$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'
_ArrayDisplay($AR, '1D - unsortiert')
_Array2DSortByCountSameEntrys($AR)
_ArrayDisplay($AR, '1D - sortiert nach Anzahl gleicher Einträge; fallend')
_ArrayDisplay($AR2, '2D - unsortiert')
_Array2DSortByCountSameEntrys($AR2,2,0)
_ArrayDisplay($AR2, '2D - sortiert nach Anzahl gleicher Einträge in Col 2; steigend')
;----------------------------------------------------------------------------------------------------------------------
; 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
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