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é :mrgreen:
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é :mrgreen:

Re: Petit problème de tri

Publié : jeu. 01/juil./2021 9:26
par MLD
@Papipp
Tu devient un dieu du tri. :lol:

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. :lol:
@microdevweb
Le tri n'est pas correct.Le chiffre 20, c'est après la série de 2,et après 3 :mrgreen: