Page 2 sur 2
Re: Petit problème de tri
Publié : lun. 28/juin/2021 9:03
par PAPIPP
Voici une autre méthode à base d'expressions régulières pour séparer les nombres
Il doit en exister d'autres.
Code : Tout sélectionner
;;;Separation des nombres et des lettres
Global Dim tabd.s(10)
tabd.s(1) = "10000A"
tabd.s(2) = "2Aa"
tabd.s(3) = "2"
tabd.s(4) = "3"
tabd.s(5) = "20"
tabd.s(6) = "2A"
tabd.s(7) = "2Ab"
tabd.s(8) = "2C"
tabd.s(9) = "1"
tabd.s(10) = "10000Az"
If CreateRegularExpression(0, "[0-9]+")
Dim res$(0)
For i=1 To 10
ExtractRegularExpression(0,tabd(i),res$());;; séparation des nombres
tabd(i) = RSet(res$(0), 8, " ")+"!"+tabd(i) ;;; préparation pour le tri avec séparateur ! ou autre séparateur autre que space
Next
SortArray(tabd(), #PB_Sort_Ascending | #PB_Sort_NoCase,1,10)
For i=1 To 10
pospv=FindString(tabd(i),"!",1)
Debug Right(tabd(i),Len(tabd(i))-pospv);;; élimination des nombres qui nous ont servis pour le tri
Next
FreeRegularExpression(0)
EndIf
A+
Re: Petit problème de tri
Publié : lun. 28/juin/2021 10:15
par kernadec
bjr à tous
PAPIPP a écrit :Si j'ai bien compris la codification proposée, les nombres sont prioritaires sur les lettres
je vais dire une banalité

l'ordre vient de la valeur des caractères de la table ASCII
les nombres "0" = 48
les majuscules "A" = 65
les minuscules "a" = 97
Cordialement
Re: Petit problème de tri
Publié : lun. 28/juin/2021 13:39
par PAPIPP
Merci kernadec
Oui c'est évident (0-9)<(A-Z)<(a-z) mais ce que je veux dire c'est que entre 21 et 2A et 2a si on laisse les lettres A et a
le tri sera compte tenu de la table ascii 21<2A<2a or 21 > 2A et non inférieur. Donc il faut séparer les nombres des lettres et organiser les nombres qui sont définis en chaine de caractères ce qui fait passer 21<9 qui est faux à 9<21 qui est correct . Exemple donné ci-dessous avec prg en fin.
Résultats :
1
10000
2
20
21
25
26
3
32
9
alors que l'ordre numérique doit être
en gardant les nombres sous forme de chaine de caractères avec des blancs et sans éliminer ces blancs
1
2
3
9
20
21
25
26
32
10000
Code : Tout sélectionner
Global Dim tabd.s(10)
tabd.s(1) = "10000"
tabd.s(2) = "2"
tabd.s(3) = "21"
tabd.s(4) = "3"
tabd.s(5) = "20"
tabd.s(6) = "32"
tabd.s(7) = "25"
tabd.s(8) = "26"
tabd.s(9) = "1"
tabd.s(10) = "9"
SortArray(tabd(), #PB_Sort_Ascending | #PB_Sort_NoCase,1,10)
For i=1 To 10
Debug tabd(i)
Next
Debug "en gardant les nombres sous forme de chaine de caractères avec des blancs et sans éléminer ces blancs "
For i=1 To 10
tabd(i) = RSet(tabd(i), 7, " ")
Next
SortArray(tabd(), #PB_Sort_Ascending | #PB_Sort_NoCase,1,10)
For i=1 To 10
Debug tabd(i)
Next
A+
Re: Petit problème de tri
Publié : mer. 30/juin/2021 12:52
par microdevweb
Bonjour,
Petite remarque un tableau commence à l'indice 0 et fini a n élément -1
Tu peux tjr essayer le tri à bulle
Code : Tout sélectionner
#N_ITEM = 10
Global Dim tab.s(#N_ITEM)
tab(0) = "10000A"
tab(1) = "2Aa"
tab(2) = "2"
tab(3) = "3"
tab(4) = "20"
tab(5) = "2A"
tab(6) = "2Ab"
tab(7) = "2C"
tab(8) = "1"
tab(9) = "10000Az"
; buble sort
For i = #N_ITEM -2 To 0 Step -1
For j = 0 To i
n = j+1
If tab(j) > tab(n)
; switch value
temp.s = tab(j)
;Debug temp
tab(j) = tab(n)
tab(n) = temp
EndIf
Next
Next
For i = 0 To 9
Debug tab(i)
Next
Re: Petit problème de tri
Publié : jeu. 01/juil./2021 9:21
par MLD
@microdevweb
Et alors, le résulta est erroné

Re: Petit problème de tri
Publié : jeu. 01/juil./2021 9:26
par MLD
@Papipp
Tu devient un dieu du tri.

Re: Petit problème de tri
Publié : lun. 05/juil./2021 15:45
par Naheulf
Je viens seulement de comprendre l'ordre du tri. En fait les références de dossiers peuvent être considérées comme les références "compactée" des références suivantes (en utilisant "|" pour séparer les parties et "_" à la place de l'espace) :
Code : Tout sélectionner
00001|__
00002|__
00002|A_
00002|Aa
00002|Ab
00002|C_
00003|__
00020|__
10000|A_
10000|Az
Edit : on peut aussi remplacer les zéros initiaux par des espace. Laissant une réf qui dans sa forme actuelle peut être raccourcie via Trim().
Re: Petit problème de tri
Publié : mar. 06/juil./2021 6:43
par microdevweb
Avec une petite amélioration, évidement je ne sais pas si l'ordre est celui que tu désire, mais je penses que cela peut être une piste
Code : Tout sélectionner
#N_ITEM = 10
Global Dim tab.s(#N_ITEM)
tab(0) = "10000A"
tab(1) = "2Aa"
tab(2) = "2"
tab(3) = "3"
tab(4) = "20"
tab(5) = "2A"
tab(6) = "2Ab"
tab(7) = "2C"
tab(8) = "1"
tab(9) = "10000Az"
; buble sort
For i = #N_ITEM -2 To 0 Step -1
For j = 0 To i
n = j+1
a.s = LCase(RSet(tab(j),6,"0"))
b.s = LCase(RSet(tab(n),6,"0"))
If a > b
; switch value
temp.s = tab(j)
;Debug temp
tab(j) = tab(n)
tab(n) = temp
EndIf
Next
Next
For i = 0 To 9
Debug tab(i)
Next
; Result
; 1
; 2
; 3
; 20
; 2A
; 2C
; 2Aa
; 2Ab
; 10000A
; 10000Az
Re: Petit problème de tri
Publié : mar. 06/juil./2021 9:42
par MLD
@Naheulf
Oui tu as compris le principe.
@microdevweb
Le tri n'est pas correct.Le chiffre 20, c'est après la série de 2,et après 3
