Schnelleres ArrayUnique

  • Kleine aber feine Alternative zu _ArrayUnique (arbeitet mit Dict), wenn es wirklich nur darum geht Duplikate (vor allem aus großen String-Arrays) zu filtern. Nebeneffekt ist, dass das Array sortiert wird.

    Getestet nur mit >500k Element String Arrays.

    [autoit]

    Func _ArrayUniqueEx(ByRef $aIpt)
    Local $iUBound = UBound($aIpt)-1, $aOut[$iUBound+1], $iCount = 0
    ;~ _ArrayDisplay($aIpt)
    _ArraySort($aIpt, 0, 0, 0, 0, 1)
    ;~ _ArrayDisplay($aIpt)
    For $n = 0 To $iUBound-1
    If $aIpt[$n] <> $aIpt[$n+1] Then
    $aOut[$iCount] = $aIpt[$n]
    $iCount += 1
    EndIf
    Next
    $aOut[$iCount] = $aIpt[$iUBound]
    ReDim $aOut[$iCount+1]
    $aIpt = $aOut
    EndFunc

    [/autoit]
  • Wie hast du es denn getestet, dass es schneller ist als _ArrayUnique?
    Bei meinen Tests war es nämlich deutlich langsamer, was ich aufgrund der Sortierung auch nicht sehr verwunderlich finde.

    Wenn du eine Funktion für 1D-Arrays suchst welche auf jeden Fall schneller arbeitet dann versuch es doch mal so:

    AutoIt
    Func _ArrayUnique2(Const ByRef $aA)
        Local $oD = ObjCreate('Scripting.Dictionary')
        For $i In $aA
            $oD($i) = 0
        Next
        Return $oD.Keys()
    EndFunc
    • Weil ich in meinem Script bei _ArrayUnique() eine unerwartete Fehlermeldung bekommen hatte, habe ich dieses Beispiel aus der AutoIt Hilfe getestet... doch zu meinem erstaunen funktioniert dies auch nicht... nicht mehr.
    • ?(
  • Final - nicht Beta.

    Beheben kannst du ihn wenn du in der _ArrayUnique() die Zeilen If IsInt($aArray[$iBase]) Then und Switch VarGetType($aArray[$iBase]) folgendermaßen änderst:

    AutoIt
    If IsInt($iDims = 1 ? $aArray[$iBase] : $aArray[$iBase][0]) Then
        Switch VarGetType($iDims = 1 ? $aArray[$iBase] : $aArray[$iBase][0])

    Einmal editiert, zuletzt von AspirinJunkie (16. September 2015 um 13:24)