Petit problème de tri

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Petit problème de tri

Message 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"

Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Petit problème de tri

Message 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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

Message 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é
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Petit problème de tri

Message 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 ]
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Petit problème de tri

Message 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.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Petit problème de tri

Message 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+
Dernière modification par PAPIPP le sam. 26/juin/2021 14:16, modifié 1 fois.
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
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Petit problème de tri

Message 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...
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Petit problème de tri

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

Message 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]
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

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

Re: Petit problème de tri

Message 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+
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
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Petit problème de tri

Message par GallyHC »

Pour le code de PAPPIP, on peut faire une petite optimisation :

Code : Tout sélectionner

For i=1 To 10
  tabd(i) = RSet(tabd(i), 7, " ")
Next
Cordialement,
Dernière modification par GallyHC le dim. 27/juin/2021 16:54, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

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

Re: Petit problème de tri

Message 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+
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
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Petit problème de tri

Message par MLD »

Bravo Pappip. Effectivement c'est l'idée de base. Ta solution donne un bon résultat. :lol:
Bonne journée.
Répondre