Case-Sensitive arraySort?

  • Gibt es eine möglichkeit, dass arraysort case-sensitive arbeitet?

    aus
    test
    TEST
    test
    TEST
    bla

    wird nur
    bla
    test
    TEST
    test
    TEST

    nicht

    bla
    test
    test
    TEST
    TEST

    oder
    bla
    TEST
    TEST
    test
    test

    also die reihenfolge von zeilen untereinander, die sich nur im case unterscheiden wird nicht verändert

    Hier der Testcode:

    #include <array.au3>
    Dim $array [6]

    $array [1]="test"
    $array [2]="TEST"
    $array [3]="test"
    $array [4]="TEST"
    $array [5]="bla"
    _arraysort ($array)
    _arrayDisplay ($array)

    • Offizieller Beitrag

    Die von dir gewünschte Ausgabe kann niemals das Ergebnis einer Sortierung sein.
    Reihenefolge Ascending: erst ALLE Großbuchstaben A-Z dann ALLE Kleinbuchstaben a-z.

    So kannst du das lösen:

    [autoit]

    #include <Array.au3>
    Global $a[5] = ['test','TEST','test','TEST','bla']
    For $i = 0 To UBound($a) -1
    $a[$i] = StringToBinary($a[$i])
    Next
    _ArraySort($a)
    For $i = 0 To UBound($a) -1
    $a[$i] = BinaryToString($a[$i])
    Next
    _ArrayDisplay($a)

    [/autoit]
  • ne das ist ja auch unsinn, wenn dann bla zwischen TEST und test steht.....

    Hintergrund: Suche nach duplikaten in einem array of string

    bla
    test
    TEST
    test
    TEST

    hat das Problem, dass es nicht reicht, jeweil einen eintrag und den Nachfolger zu betrachten....


    in diesem Fall sollte das Ergebnis-Array
    bla
    test
    TEST

    oder
    bla
    TEST
    test

    sein

    • Offizieller Beitrag

    Suche nach duplikaten in einem array of string

    Na wenns so ist :D
    Verwende doch aus meinen UDF die Funktion _Array2DDblDel() (s. Signatur)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $a[5] = ['test','TEST','test','TEST','bla']
    _Array2DDblDel($a,1)
    _ArrayDisplay($a)

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _Array2DDblDel(ByRef $ARRAY [, $CASESENS=0])
    ;
    ; Description - From an 1D/2D Array will delete double entries (2D -> combination by '[n][0]' to '[n][x]').
    ; - Autodetection 1D/2D Array
    ; - By using string, you can choose case sensitivity.
    ;
    ; Parameter $ARRAY: Array to sort
    ; optional $CASESENS: Case sensitivity off[0] or on[1] (default 0)
    ;
    ; Return Succes ByRef Array without doubles
    ; Count of doubles
    ; Failure 0 and set @error = 1; no array
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _Array2DDblDel(ByRef $ARRAY, $CASESENS=0)
    Local $arTmp[1] = [''], $dbl = 0, $count = 0, $x, $l, $val, $valTmp, $i, $k
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $Ubound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    For $i = 0 To UBound($ARRAY)-1
    $dbl = 0
    For $k = 0 To UBound($arTmp)-1
    Switch $CASESENS
    Case 0
    If $arTmp[$k] = $ARRAY[$i] Then
    $dbl = 1
    $count += 1
    EndIf
    Case 1
    If $arTmp[$k] == $ARRAY[$i] Then
    $dbl = 1
    $count += 1
    EndIf
    EndSwitch
    Next
    If $dbl = 0 Then
    If $arTmp[0] = "" Then
    $arTmp[0] = $ARRAY[$i]
    Else
    ReDim $arTmp[UBound($arTmp)+1]
    $arTmp[UBound($arTmp)-1] = $ARRAY[$i]
    EndIf
    Else
    $dbl = 0
    EndIf
    Next
    Else
    ReDim $arTmp[1][$Ubound2nd]
    $arTmp[0][0] = ''
    $x = 0
    For $i = 0 To UBound($ARRAY)-1
    $dbl = 0
    $val = ''
    $valTmp = ''
    For $l = 0 To $Ubound2nd-1
    $val &= $ARRAY[$i][$l]
    Next
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $Ubound2nd-1
    $valTmp &= $arTmp[$k][$l]
    Next
    Switch $CASESENS
    Case 0
    If $valTmp = $val Then
    $dbl = 1
    $count += 1
    EndIf
    Case 1
    If $valTmp == $val Then
    $dbl = 1
    $count += 1
    EndIf
    EndSwitch
    $valTmp = ''
    Next
    If $dbl = 0 Then
    If $x = 1 Then ReDim $arTmp[UBound($arTmp)+1][$Ubound2nd]
    For $l = 0 To $Ubound2nd-1
    If $arTmp[0][0] = '' Or $x = 0 Then
    $arTmp[0][$l] = $ARRAY[0][$l]
    If $l = $Ubound2nd-1 Then $x = 1
    Else
    $arTmp[UBound($arTmp)-1][$l] = $ARRAY[$i][$l]
    $x = 2
    If $l = $Ubound2nd-1 Then $x = 1
    EndIf
    Next
    Else
    $dbl = 0
    EndIf
    Next
    EndIf
    $ARRAY = $arTmp
    Return $count
    EndFunc ; ==>_ArrayDblDel

    [/autoit]
  • Wenn es nur um das zweistufige Sortieren geht, wäre das ein Anfang:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Global $a[5] = ['test','TEST','test','TEST','bla']
    _ExtendedSort1D($a,1)

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

    _ArrayDisplay($a)
    Func _ExtendedSort1D(ByRef $a,$Descending=0)
    _ArraySort($a)
    For $i = 0 To UBound($a)-3
    If StringCompare($a[$i], $a[$i+1]) <> 0 Then
    $start = $i+1
    For $i = $start+1 To UBound($a)-2
    If $a[$i] <> $a[$i+1] Then ExitLoop
    Next
    _Innersort($a,$start,$i)
    EndIf
    Next
    If $Descending Then _ArrayReverse($a)
    EndFunc

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

    Func _Innersort(ByRef $a,$start,$end)
    ConsoleWrite("vb" & @CRLF)
    For $i = $start To $end
    For $z = $i To $end
    If StringCompare($a[$z],$a[$i],1) <= 0 Or $i=$z Then ContinueLoop
    $temp = $a[$z]
    $a[$z] = $a[$i]
    $a[$i] = $temp
    ;~ EndIf
    Next
    Next
    EndFunc

    [/autoit]