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" )
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
==> Vous devez transformer chaque case du tableau en nombre pour que cette condition marche bien :
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.