Petit problème de tri

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Petit problème de tri

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Petit problème de tri

Message 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
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Petit problème de tri

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Petit problème de tri

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

Message par MLD »

@microdevweb
Et alors, le résulta est erroné :mrgreen:
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

Message par MLD »

@Papipp
Tu devient un dieu du tri. :lol:
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Petit problème de tri

Message 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().
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Petit problème de tri

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
MLD
Messages : 1103
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

Message 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:
Répondre