Page 1 sur 1

[R] _ArraySort() numérique

Posté : mar. 07 juil. 2009 14:20
par Iste
Salutations,

J'ai cherché sans trouver, comment effectuer un _ArraySort() de facon numerique et non pas alphabétique.
car par défaut, mes 3 fichiers 5.txt 101.txt et 4000.txt se retrouve dans cet ordre
5.txt > 4000.txt > 101.txt

Et le probleme, c'est qu'en vrai, j'en ai plus de 1000 de fichier :s

Vala, si quelqu'un a une solution.. merci d'avance !

Edit, apres avoir regardé dans array.au3, j'ai tombé la dessus

Code : Tout sélectionner

While ($avArray[$L] < $vPivot And IsNumber($avArray[$L])) Or (Not IsNumber($avArray[$L]) And StringCompare($avArray[$L], $vPivot) < 0)
    $L += 1
WEnd
J'ai donc viré tout les .txt car pas utiles, mais ca ne change rien :/

Re: [..] _ArraySort() numérique

Posté : mar. 07 juil. 2009 14:42
par jumby

Code : Tout sélectionner

#include <Array.au3>

Local $avArray[3] = [5, 4000, 101]

_ArraySort($avArray, 0, 0, 0, 0)
_ArrayDisplay($avArray, "Ordre croissant" )

Re: [..] _ArraySort() numérique

Posté : mar. 07 juil. 2009 14:44
par Iste

Code : Tout sélectionner

#include <Array.au3>

Local $avArray[3] = ["5", "4000", "101"]

_ArraySort($avArray, 0, 0, 0, 0)
_ArrayDisplay($avArray, "Ordre croissant" )
:roll:

Vais modifier la fonction d'array.au3 pour la forcer a retirer les .txt (car en fait c'est mieux avec ^^') et a prendre les nom de fichier pour des numero et non des string

edit: hop hop hop, ca semble marcher ! me reste a rajouter les .txt... enfin, un coup de stringleft() pis ca sera bon

Code : Tout sélectionner

Local $avArray[3] = ["5", "4000", "101"]

My_ArraySort($avArray,0,0,0,0)
_ArrayDisplay($avArray, "Ordre croissant" )


Func My_ArraySort(ByRef $avArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
    If Not IsArray($avArray) Then Return SetError(1, 0, 0)

    Local $iUBound = UBound($avArray) - 1

    ; Bounds checking
    If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
    If $iStart < 0 Then $iStart = 0
    If $iStart > $iEnd Then Return SetError(2, 0, 0)

    ; Sort
    Switch UBound($avArray, 0)
        Case 1
            My__ArrayQuickSort1D($avArray, $iStart, $iEnd)
            If $iDescending Then _ArrayReverse($avArray, $iStart, $iEnd)
        Case 2
            Local $iSubMax = UBound($avArray, 2) - 1
            If $iSubItem > $iSubMax Then Return SetError(3, 0, 0)

            If $iDescending Then
                $iDescending = -1
            Else
                $iDescending = 1
            EndIf

            __ArrayQuickSort2D($avArray, $iDescending, $iStart, $iEnd, $iSubItem, $iSubMax)
        Case Else
            Return SetError(4, 0, 0)
    EndSwitch

    Return 1
EndFunc   ;==>_ArraySort

Func My__ArrayQuickSort1D(ByRef $avArray, ByRef $iStart, ByRef $iEnd)
    If $iEnd <= $iStart Then Return

    Local $vTmp

    ; QuickSort
    Local $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)]
    Do
            ; While $avArray[$L] < $vPivot
            While Number($avArray[$L]) < Number($vPivot)
                $L += 1
            WEnd
            ; While $avArray[$R] > $vPivot
            While Number($avArray[$R]) > Number($vPivot)
                $R -= 1
            WEnd

        ; Swap
        If $L <= $R Then
            $vTmp = $avArray[$L]
            $avArray[$L] = $avArray[$R]
            $avArray[$R] = $vTmp
            $L += 1
            $R -= 1
        EndIf
    Until $L > $R

    My__ArrayQuickSort1D($avArray, $iStart, $R)
    My__ArrayQuickSort1D($avArray, $L, $iEnd)
EndFunc   ;==>__ArrayQuickSort1D
 

Re: [R] _ArraySort() numérique

Posté : mer. 08 juil. 2009 10:56
par tolf
_ArraySort a écrit :

Code : Tout sélectionner

IsNumber($avArray[$L])
==> Vous devez transformer chaque case du tableau en nombre pour que cette condition marche bien :

Code : Tout sélectionner

$tableau[$caseDuTableau] = Nomber($tableau[$caseDuTableau])

Re: [R] _ArraySort() numérique

Posté : mer. 08 juil. 2009 22:02
par Iste
oui je vois ca, mais justement, c'est pas des nombre mais des chaine de texte contenant des nombres
Dpnc, j'aurai aussi pu faire une fonction pour néttoyer l'array avant de la tirer, mais je trouve ca plus pratique d'utiliser une fonction tout en un
De plus ca me permet de garder l'array intacte pour plus tard

Mais merci quand meme, car je n'avais pas penser a faire ca ^^

Re: [R] _ArraySort() numérique

Posté : jeu. 09 juil. 2009 12:50
par tolf
Le mieux serait d'ajouter un paramètre à la fonction _ArraySort pour forcer la comparaison numérique ou au contraire la comparaison de chaines.