[R] _ArraySort() numérique

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

[R] _ArraySort() numérique

#1

Message 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 :/
Modifié en dernier par Iste le mar. 07 juil. 2009 14:58, modifié 2 fois.
Signez ici
Avatar du membre
jumby
Niveau 5
Niveau 5
Messages : 118
Enregistré le : jeu. 12 juin 2008 17:50
Status : Hors ligne

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

#2

Message 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" )
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

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

#3

Message 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
 
Signez ici
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [R] _ArraySort() numérique

#4

Message 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])
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] _ArraySort() numérique

#5

Message 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 ^^
Signez ici
tolf
Niveau 7
Niveau 7
Messages : 318
Enregistré le : ven. 15 févr. 2008 12:25
Localisation : Paris
Status : Hors ligne

Re: [R] _ArraySort() numérique

#6

Message 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.
Lisez la documentation d'AutoIt en français (et participez svp :mrgreen:) !

Mes UDF :
[/i][/b]
Répondre