Page 1 sur 2
Petit problème de tri
Publié : sam. 26/juin/2021 10:07
par MLD
Je voudrais trié ce tableau. SVP
(le problème a été posé sur le fofo US par collectionneurdave, Marc 56 a participé a cette affaire, alors s'il te plait laisse les méninges Français s’ exprimés Merçi)
Code : Tout sélectionner
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"
Re: Petit problème de tri
Publié : sam. 26/juin/2021 11:19
par omega
Bonjour MLD,
En utilisant une liste, peut être....
Code : Tout sélectionner
Structure NewTabD
CleTri.s
EndStructure
Global Dim tabd.s(10),NewList NewTabd.NewTabD()
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"
For i=1 To 10
AddElement(NewTabD())
NewTabD()\CleTri=tabd(i)
Next i
SortStructuredList(NewtaBd(), #PB_Sort_Ascending, OffsetOf(NewtaBd\cletri),TypeOf(NewtaBd\cletri))
ForEach(NewTabd())
CleTri$=NewTabd()\CleTri
Debug CleTri$
Next
Re: Petit problème de tri
Publié : sam. 26/juin/2021 12:17
par MLD
Bonjour OMEGA
le tableau n'est pas trié.
Le résultat doit être:
1
2
2A
2Aa
2Ab
2C
3
20
10000A
10000Az
Merci d'avoir essayé
Re: Petit problème de tri
Publié : sam. 26/juin/2021 12:54
par Micoute
Code : Tout sélectionner
; Tri par permutation Buble sort
Procedure BubleSort(Array v.s(1),n)
Protected sent.b=0,i=0,E$
While (n<>1 And sent=0)
sent=1
For i=0 To n-2
If(v(i)>v(i+1))
E$=v(i)
v(i)=v(i+1)
v(i+1)=E$
sent=0
EndIf
Next
n-1
Wend
EndProcedure
Procedure Affiche(Array v.s(1),n)
Protected i
For i=1 To n
Debug "Vecteur "+Str(i)+" : "+v(i)
Next
EndProcedure
; Un tableau pour le test
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"
Define n.i=10
Debug "Vecteur non-trié:"
Affiche(tabd(),n)
BubleSort(tabd(),n)
Debug "Vecteur trié:"
Affiche(tabd(),n)
[/code-pb ]
Re: Petit problème de tri
Publié : sam. 26/juin/2021 14:05
par GallyHC
Bonjour,
Franchement, je ne comprend pas le pourquoi de ce tri :
1
2
2A
2Aa
2Ab
2C
3
20
10000A
10000Az
pourquoi :
20
10000A
10000Az
en dernier ? Pour moi ce sera trié par tout ce qui commence par 1, puis 2, puis 3, etc.
Re: Petit problème de tri
Publié : sam. 26/juin/2021 14:15
par PAPIPP
Bonjour à tous
Comme cela est-ce OK
Code : Tout sélectionner
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"
For i=1 To 10
tabd(i)=Right(Space(6)+tabd(i),7)
Next
SortArray(tabd(), #PB_Sort_Ascending | #PB_Sort_NoCase,1,10)
For i=1 To 10
Debug _s(Trim(tabd(i)))
Next
A+
Re: Petit problème de tri
Publié : sam. 26/juin/2021 14:16
par omega
C'est ce que je croyais moi aussi, le code que j'ai proposé répond parfaitement à cet ordre (1....1000 ... 2.....3....etc... )
Mais je crois que LMD cherche à trier un format composé qu'il va falloir gérer en créant un code spécifique (numérique en 1er puis alphabétique, caractère par caractère...), il n'existe pas de commande de tri qui fait ce genre d'ordre car ce tri n'est ni numérique, ni alpha numérique...il est spécial...
Re: Petit problème de tri
Publié : sam. 26/juin/2021 14:25
par GallyHC
avec mysql par exemple (select * from test order by libelle):
Code : Tout sélectionner
ID LIBELLE
13 1
5 10000A
14 10000Az
7 2
9 20
10 2A
6 2Aa
11 2Ab
12 2C
8 3
même résultat
Re: Petit problème de tri
Publié : sam. 26/juin/2021 16:00
par MLD
Merci a tous .Mais aucun tri n'est satisfaisant.
Pappip est le plus proche.
Gally :Ce tri est fait pour trier des dossiers d'un cabinet d'avocat
Il comporte des dossiers admettons de 1 a 5000, avec des sous dossiers voir des sous,sous dossiers
ce qui peut faire dossier 1 puis sous dossier A, et sous sous dossier Aa,Ab, etc
jusqu'a 5000 A, 5000 Aa 5000B,5000 Ba ,ect
La solution :
Code : Tout sélectionner
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"
For z = 1 To 10
Alpha.s = Right(tabd.s(z),Len(tabd.s(z)) - Len(Str(Val(tabd.s(z)))))
tabd.s(z)= RSet(Str(Val(tabd.s(z))),6," ") + Alpha
Next
SortArray(tabd.s(),#PB_Sort_Ascending)
For X = 1 To 10
Debug Trim(tabd.s(X))
Next
End
[code]
Re: Petit problème de tri
Publié : sam. 26/juin/2021 16:29
par MLD
Pour OMEGA et Gally
Dans un tri numérique
1-1000 -2, le résultat est bien 1-2-1000.
1000 ne peut pas être après 1,cela n'aurais aucun sens.

Re: Petit problème de tri
Publié : sam. 26/juin/2021 21:47
par PAPIPP
Bravo MLD
C’est une sacré bidouille.
Mais en fonction de ma réflexion ci-dessous je me pose la question comment la codification qui nous est imposée obtient-elle cette relation d’ordre.
Ou comment codifier de façon à obtenir cette relation d’ordre ?
Par exemple existe-il une entité comme 2A6 B3c ..etc
Ne connaissant pas le mode de codification il est difficile de réaliser un tri
Compte tenu de ce que nous avions voici ma réflexion sur le pb
Je me pose une question d’ordre logique
Car Mld nous propose la relation d’ordre suivante
1<2<2A<2Aa<2Ab<2C<3<20<10000A<10000Az
N’y a t-il pas une incohérence dans toutes ces inéquations
Si blanc est strictement inférieur à tout caractère de l’ensemble des zones.
On peut remplacer rien par un caractère blanc afin d’obtenir la même longueur. Ces blancs peuvent être placés avant ou après l’entité. Pour respecter au mieux la relation d’ordre il faut les placer avant ,je remplace ici blanc par _
En effet on a bien ______1 < ______2 et ______1 <100000A …. etc
En effet comment __1<__2<_2A<2Aa<2Ab cohérent jusque-là mais 2Ab<_2C<__3 n’est pas cohérent avec l’hypothèse prise au départ en effet _
Or l’hypothèse que nous avons prise en choisissant _ c’est que ce caractère est < strictement inférieur à tout autre caractère de la zone de tri ce qui est faux dans ce cas 2<_ et _2<__ tout cela est contraire à l’hypothèse de départ
Que peut-on en déduire
1) Que la relation d’ordre qu’on nous soumet n’est pas cohérente
2) Que le choix du blanc inférieur à tout caractère de l’ensemble des zones n’est pas un bon choix
Mais quel choix doit-on prendre ?
3) Que la longueur n'est pas identique pour chaque entité (voir la codification qui nous est cachée ici)
Je penche pour la première hypothèse.
A+
Re: Petit problème de tri
Publié : dim. 27/juin/2021 9:18
par GallyHC
Pour le code de PAPPIP, on peut faire une petite optimisation :
Cordialement,
Re: Petit problème de tri
Publié : dim. 27/juin/2021 10:11
par MLD
@Pappip
Je vais rendre César, ce qui appartient a Marc56 qui sur le forum US a eu l'idée au départ avec une list, que j'ai bidouillé avec un tableau.
Les espaces en tête peuvent être remplacés par des 0. Ce qui veut dire que c'est la longueur qui importe,ensuite je me suis aperçus que l'on peu mettre plusieurs lettres en complément ce qui me solutionnais mon problème.

Re: Petit problème de tri
Publié : dim. 27/juin/2021 22:26
par PAPIPP
Si j'ai bien compris la codification proposée, les nombres sont prioritaires sur les lettres qui ne représentent que des sous dossiers
Alors voici une autre façon de programmer ce tri
il faut séparer les nombres de chaque entité et les placer en tête
et après tri éliminer les nombres qui nous ont servi à trier.
Code : Tout sélectionner
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"
For i=1 To 10
valn.s=Str(Val(tabd(i)));;; séparation des nombres
tabd(i) = RSet(valn, 8, " ")+"!"+tabd(i) ;;; préparation pour le tri avec séprateur ! 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 servi pour le tri
Next
A+
Re: Petit problème de tri
Publié : lun. 28/juin/2021 7:02
par MLD
Bravo Pappip. Effectivement c'est l'idée de base. Ta solution donne un bon résultat.
Bonne journée.