Hallo Leute,
Ich habe die Array Unique ein wenig erweitert.
Ich habe vor kurzen in einen Post gelesen das Array Unique erweitert wurde auf die Ausgabe Count,
dazu hat Oscar ein Funktion Gepostet die sehr schnell ist und wie ich halt bin, versuchte ich alles um in AutoIT alles an Performenc raus zu holen, das ist mein Ergebnis.
um welchen Post es geht: #Post
Spoiler anzeigen
; #FUNCTION# ====================================================================================================================
; Name...........: _ArrayUniqueEx
; Description ...: Returns Gibt ein eindeutiges 1 oder 2 Dimensonen Array zurück
; Syntax.........: _ArrayUniqueEx($aArray,[ $iDimension = 0,[ $iBase = 0,[ $Count = 0,[ $iCase = 0,[ $iOccur = 0,[ $iPost = 0,[ $iFlag = 2,[ $vDelim = '|']]]]]]]])
; Parameters ....: $aArray - Das Array bedienen
; $$iColumn - [optional] Die Dimension zum verwenden des Array
; $iBase - [optional] Ab welchen Index wird gefunden Standart - 0
; $Count - [optional] das wieviele auftreten des jeweiligen element 2 dimensionen array rückgabe
; $iCase - [optional] Groß-und Kleinschreibung werden berücksichtigt Standart nein - 0
; 0 = Groß- und Kleinschreibung werden nicht berücksichtigt (Standardwert).
; 1 = Berücksichtigt Groß- und Kleinschreibung.
; 2 = Groß- und Kleinschreibung werden nicht berücksichtigt. Es findet ein einfacherer, schnellerer Vergleich statt
; $iOccur - [optional] Das wievielte Auftreten des Unterstrings soll gefunden werden. Ist der Wert negativ, wird von rechts ausgehend gesucht. Der Standardwert ist 1 (erstes Auftreten von links ausgehend).
; $iPost - [optional] Die Startposition für die Suche.
; $iFlag - [optional] ändert wie das Teilen des Strings funktionieren soll. Es können mehrere Flags zusammen verwendet werden, [ Dieses Flag wird nur bei NICHT nutzung von $Count Berücksichtigt ]
; 0 = (Standard), es fungiert jedes in den Trennzeichen enthaltene Zeichen als Trennmarkierung
; 1 = es wird der gesamte Trennzeichenstring als Trennmarkierung genutzt
; 2 = deaktiviert die Rückgabe der Anzahl im ersten Element. Dadurch wird das Array
; $vDelim - [optional] Ein oder mehrere Trennzeichen. Die Groß- und Kleinschreibung wird berücksichtigt. [ Standart "|" ]
; Return values .: Erfolg - Gibt einen 1-dimensionalen Array mit nur die einzigartigen Elemente dieser Dimension oder ein 2 dimensionen array mit der viezahl des aufgetrehtenen element.
; Returns Erfolg 1 oder 2 Dimension Array oder Setzt @error
; 0 - Kein error.
; -1 - Kein Array oder größer als ein 2 Dimensionen Array
; -2 - Übergebener wert von $inCase oder $iFlag ausserhalb der Bestimmung
; -3 - Spalte größer oder kleiner als vorhanden
; -4 - Kein Fund
; Author ........: Kleiner (Autoit.de)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _ArrayUniqueEx(ByRef $aArray, Const $iColumn = 0, Const $iBase = 0, Const $Count = 0, Const $iCase = 0, Const $iOccur = 0, Const $iPost = 0, Const $iFlag = 2, $vDelim = '|')
[/autoit] [autoit][/autoit] [autoit]If Not IsArray($aArray) Or UBound($aArray, 0) > 2 Then Return SetError(1, 0, -1)
If ($iFlag < 0 Or $iFlag > 2) Or ($iCase < 0 Or $iCase > 2) Then Return SetError(2, 0, -2)
Local $iUB = UBound($aArray), $iIndex[$iUB], $sTmp, $j = 0
Local $iStart, $iEnd, $iMid, $iTmp
If Not UBound($aArray, 2) Then
If $Count Then
For $i = $iBase To $iUB - 1
$pos = StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i] & $vDelim, $iCase, $iOccur, $iPost)
Switch Not $pos
Case True
$sTmp &= $vDelim & $aArray[$i]
$iIndex[$j] = (StringLen($sTmp) - StringLen($aArray[$i]))
$aArray[$j] = 1
$j += 1
Case False
$iTmp = Int($pos / (StringLen($sTmp) / $j))
If $pos = $iIndex[$iTmp] Then
$aArray[$iTmp] += 1
ElseIf $pos = $iIndex[$iTmp + 1] Then
$aArray[$iTmp + 1] += 1
Else
$iStart = 0
$iEnd = ($j - 1)
$iMid = Int(($iEnd + $iStart) / 2)
While $iStart <= $iMid And $pos <> $iIndex[$iMid]
If $pos < $iIndex[$iMid] Then
$iEnd = $iMid - 1
Else
$iStart = $iMid + 1
EndIf
$iMid = Int(($iEnd + $iStart) / 2)
WEnd
$aArray[$iMid] += 1
EndIf
EndSwitch
Next
Else
[/autoit] [autoit][/autoit] [autoit]For $i = $iBase To $iUB - 1
Switch Not StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i] & $vDelim, $iCase, $iOccur, $iPost)
Case True
$sTmp &= $vDelim & $aArray[$i]
EndSwitch
Next
EndIf
[/autoit] [autoit][/autoit] [autoit]Else
[/autoit] [autoit][/autoit] [autoit]If ($iColumn > (UBound($aArray, 2) - 1) Or $iColumn < 0) Then Return SetError(3, 0, -3)
If $Count Then
For $i = $iBase To $iUB - 1
$pos = StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i][$iColumn] & $vDelim, $iCase, $iOccur, $iPost)
Switch Not $pos
Case True
$sTmp &= $vDelim & $aArray[$i][$iColumn]
$iIndex[$j] = (StringLen($sTmp) - StringLen($aArray[$i][$iColumn]))
$aArray[$j][0] = 1
$j += 1
Case False
$iTmp = Int($pos / (StringLen($sTmp) / $j))
If $pos = $iIndex[$iTmp] Then
$aArray[$iTmp][0] += 1
ElseIf $pos = $iIndex[$iTmp + 1] Then
$aArray[$iTmp + 1][0] += 1
Else
$iStart = 0
$iEnd = ($j - 1)
$iMid = Int(($iEnd + $iStart) / 2)
While $iStart <= $iMid And $pos <> $iIndex[$iMid]
If $pos < $iIndex[$iMid] Then
$iEnd = $iMid - 1
Else
$iStart = $iMid + 1
EndIf
$iMid = Int(($iEnd + $iStart) / 2)
WEnd
$aArray[$iMid][0] += 1
EndIf
EndSwitch
Next
Else
[/autoit] [autoit][/autoit] [autoit]For $i = $iBase To $iUB - 1
Switch Not StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i][$iColumn] & $vDelim, $iCase, $iOccur, $iPost)
Case True
$sTmp &= $vDelim & $aArray[$i][$iColumn]
EndSwitch
Next
EndIf
[/autoit] [autoit][/autoit] [autoit]EndIf
[/autoit] [autoit][/autoit] [autoit]If Not $sTmp Then Return SetError(4, 0, -4)
[/autoit] [autoit][/autoit] [autoit]If $Count Then
If Not UBound($aArray, 2) Then
Local $aTmp[$j][2]
$j = 0
For $str In StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, 2)
$aTmp[$j][0] = $str
$aTmp[$j][1] = $aArray[$j]
$j += 1
Next
Return $aTmp
Else
[/autoit] [autoit][/autoit] [autoit]Local $aTmp[$j][2]
$j = 0
For $str In StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, 2)
$aTmp[$j][0] = $str
$aTmp[$j][1] = $aArray[$j][0]
$j += 1
Next
Return $aTmp
EndIf
Else
Return StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, $iFlag)
EndIf
EndFunc ;==>_ArrayUniqueEx
[/autoit]Lg Kleiner