Page 1 sur 3

Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 16:41
par Brayane
Coucou :D

Voilà, je coince sur une chose et j'ai donc créer un exemple pour illustré mon problème.
J'ai un tableau structuré et je voudrait trier les élément non seulement du champs 1 mais aussi du champs 2 par apport au champs 1...

Code : Tout sélectionner

Structure Test
  
  Champs1.i
  Champs2.i
  
EndStructure

Dim Tableau.Test(99)

For I = 0 To 99
  Tableau(I)\Champs1 = Random(9, 0)
  Tableau(I)\Champs2 = Random(1000, 100)
Next

SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)

For I = 0 To 99
  Debug Str(Tableau(I)\Champs1) + " - " + Str(Tableau(I)\Champs2)
Next
Ici donc le champs 1 est trier du plus petit au plus grand et tous fonctionne normalement, mais pas le champs 2 ^^

Comment je fais pour trier aussi le champs deux par apport au champs 1 ?
Je voudrait que les champs soit trier chacun du plus petit au plus grand.

Exemple:
0 - 100
0 - 110
0 - 156
0 - 189
0 - 225
1 - 153
1 - 183
1 - 245
1 - 312
1 - 445
2 - 138
2 - 180
2 - 278
2 - 345
3 - 222
3 - 319
3 - 419
3 - 586
Etc.

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 16:51
par Ollivier
Recopie la ligne "SortStructured..."
et remplace

Champ1

par

Champ2

dans la 2nde copie de ligne.

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 16:54
par falsam
@Ollivier: Non ça ne fonctionnera pas comme ça.

Possibilité : Créer une clé de trie qui se compose de Champ1 + Champ2

Code : Tout sélectionner

Structure Test
  
  Cle.s
  
  Champs1.i
  Champs2.i
  
EndStructure

Dim Tableau.Test(99)

For I = 0 To 99
  Tableau(I)\Champs1 = Random(9, 0)
  Tableau(I)\Champs2 = Random(1000, 100)
  With Tableau(i)
    \Cle = Str(\Champs1) + RSet(Str(\Champs2), 4, "0")
  EndWith
Next

SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Cle), #PB_String)

For I = 0 To 99
  Debug Str(Tableau(I)\Champs1) + " - " + Str(Tableau(I)\Champs2)
Next

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:05
par Brayane
Super ça marche, merci Falsam :)

Edit: Bas non en faite ça marche pas :(, voir le code:

Code : Tout sélectionner

Structure Test
 
  Clef.s
 
  Champs1.i
  Champs2.i
 
EndStructure

Dim Tableau.Test(99)

For I = 0 To 99
  Tableau(I)\Champs1 = Random(100, 0)
  Tableau(I)\Champs2 = Random(1000, 100)
  Tableau(I)\Clef = Str(Tableau(I)\Champs1) + RSet(Str(Tableau(I)\Champs2), 4, "0")
Next

SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Clef), #PB_String)

For I = 0 To 99
  Debug Str(Tableau(I)\Champs1) + " - " + Str(Tableau(I)\Champs2)
Next

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:23
par Ollivier
Falsam a écrit :@Ollivier: Non ça ne fonctionnera pas comme ça.
Je fais appel à ton intelligence pour corriger cette phrase inexacte. Tu me fais passer pour un bouffon, alors que c'est la solution.

@Brayane

Alors tu sélectionnes la ligne "Sort..." (1 clic)
Après [copier]
Après [coller]
Après tu change "1" en "2"

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:29
par Anonyme2
Olivier,

il me semble avoir testé cette façon de faire et de souvenir je l'ai abandonné car cela ne fonctionnait pas bien.

sur le code de falsam qui fonctionne bien si corrigé

Le code de falsam avec un Rset du premier champ pour créer une chaine qui puisse être correctement prise en compte.

Ce tri fonctionne bien, je l'utilise dans mon projet, c'est le soldat inconnu qui avait donné un exemple sur ce forum.

Code : Tout sélectionner

Structure Test

  Clef.s

  Champs1.i
  Champs2.i

EndStructure

Dim Tableau.Test(99)

For I = 0 To 99
  Tableau(I)\Champs1 = Random(100, 0)
  Tableau(I)\Champs2 = Random(1000, 100)
  Tableau(I)\Clef = RSet(Str(Tableau(I)\Champs1) , 3, "0") + RSet(Str(Tableau(I)\Champs2), 4, "0")
Next

SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Clef), #PB_String)

For I = 0 To 99
  Debug Str(Tableau(I)\Champs1) + " - " + Str(Tableau(I)\Champs2)
Next

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:35
par falsam
Ollivier loin de moi de te faire passer pour un bouffon. J'ai testé le code de Brayane en tenant compte de tes dires.

Depuis la version 4.30 SortStructuredList utilise la méthode Mergesort. De cette manière on peut trier d'abord sur un premier champ puis sur un suivant, etc ..... ça implique plusieurs tris ce qui rend la méthode un peu lourde pour des données importantes.

J'ai du traité un fichier (texte) de 450 000 clients d'une banque sur différents critères et jamais je n'aurais fait cette méthode.

Par contre ça ne fonctionne pas avec SortStructuredArray(). Il suffit de faire le test.

Code : Tout sélectionner

Structure Test
  
  Champs1.i
  Champs2.i
  
EndStructure

Dim Tableau.Test(99)

For I = 0 To 99
  Tableau(I)\Champs1 = Random(9, 0)
  Tableau(I)\Champs2 = Random(1000, 100)
Next

SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)
SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs2), #PB_Integer)

For I = 0 To 99
  Debug Str(Tableau(I)\Champs1) + " - " + Str(Tableau(I)\Champs2)
Next
Résultat
2 - 101
1 - 104
0 - 119
8 - 157
2 - 173
8 - 200
9 - 215
3 - 218
4 - 229
On n'est loin du tri souhaité par Brayanne

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:40
par Brayane
Merci tous le monde pour votre aide :)
@Denis tous fonctionne avec ce nouveau code :)

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:40
par falsam
Denis a écrit :Le code de falsam avec un Rset du premier champ pour créer une chaine qui puisse être correctement prise en compte.
Je ne l'avais pas fait car dans le code initial de brayanne, Champ1 varié de 0 à 9

Code : Tout sélectionner

For I = 0 To 99
  Tableau(I)\Champs1 = Random(9, 0)
  Tableau(I)\Champs2 = Random(1000, 100)
Next
Evidement si braayane change son code en cours de route ..... (M’énerve ce mec)

La peau de banane moisie est proche Brayane !

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:44
par Anonyme2
Le mérite revient à falsam, j'ai juste adapté.

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 17:51
par Ollivier
@Denis

Je n'en veux à personne.

Brayane demande de trier 2 listes de champs.
Il met un exemple qui correspond à ce qu'il veut.
La 1ère liste, c'est nombres de 0 à 99.
La 2nde liste, des nombres de 100 à 1000.

Il ne veut pas un tri des 2 listes ensemble.

J'ai répondu à la question.

S'il veut un tri des 2 listes ensemble, déjà qu'il évite d'avoir 2 domaines de tri différents, ce sera plus utile!
Qu'il mette un exemple avec une seule finale, pas ses 2 séparées comme actuellement.

Ensuite, une StructureUnion devrait faire l'affaire, non?

Ça bugue vraiment?

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 18:42
par Anonyme2
J'ai testé les tris des listes et tableaux depuis longtemps et j'avais fini par adopter le code du soldat inconnu qui je pense est fiable même si c'est un long sur de très grandes listes (?).

voir ici le post de LSI
http://www.purebasic.fr/french/viewtopic.php?f=1&t=9286

Sur le tri des liste chainées dont il est question, j'avais testé et il fallait que je tri d'abord le 2ème champ puis le premier pour obtenir un résultat qui semblait correct.
Comme je n'en suis toujours pas sur, je n'effectue pas plusieurs tris de suite de cette manière dans mes codes.

Je me trompe peut-être mais à vrai dire je n'en sait rien.

Codes de test qui montrent qu'en triant le 1er champ d'abord puis le second ensuite, cela ne va pas pour les tableaux.

Pour les listes chainées, je trie d'abord le second puis le 1er, cela semble être bon. Maintenant inverser les 2 tris des listes chainées et regardez le résultat.

Code : Tout sélectionner

Define .i
EnableExplicit

Structure Test
      Champs1.i
      Champs2.i
EndStructure

Global NewList MaList.Test()
Global Dim Tableau.Test(99)
Global i

For i = 0 To 99
      If AddElement(MaList()) = 0
            MessageRequester("Erreur","Impossible d'llouer de la mémoire" +Chr(10) + "Arrêt du tri",16)
            End
      EndIf
      MaList()\Champs1 = Random(8, 0)
      MaList()\Champs2 = Random(1000, 100)
      Tableau(i)\Champs1 = Random(100, 0)
      Tableau(i)\Champs2 = Random(1000, 100)
Next

;// tri de la liste en commençant par le 2ème champ
SortStructuredList(MaList(), #PB_Sort_Ascending, OffsetOf(Test\Champs2), #PB_Integer)
SortStructuredList(MaList(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)

;// tri du tableau en commençant par le 1er champ
SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)
SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs2), #PB_Integer)

Debug "tri de la liste"
ForEach MaList()
      Debug Str(MaList()\Champs1) + " - " + Str(MaList()\Champs2)
Next

Debug ""
Debug "tri du tableau"
For i = 0 To 99
      Debug Str(Tableau(i)\Champs1) + " - " + Str(Tableau(i)\Champs2)
Next

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 18:50
par Brayane
Evidement si braayane change son code en cours de route ..... (M’énerve ce mec)
La peau de banane moisie est proche Brayane !
Bonjour, enfin re bonjour, Falsam, pourquoi tu t’énerve ainsi ?

Effectivement au départ j'ai commencer de 0 à 9 pour pas faire trop long dans le débogueur.
Mais ensuite j'ai mis plus pour voir si ça marchait encore et donc ça ne marchais plus.

Si je t’énerves bien que je vois pas trop pourquoi, c'est bien dommage.

Merci de pas écorcher mon prénom également, je respecte le tient, merci d'en faire autant à mon égard (Surement une erreur, je ne t'en veux pas bien sur) :)
"La peau de banane moisie est proche", que veux tu dire par là ?

J'ai été courtois et polie me semble t-il.
Cordialement.

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 21:52
par Ollivier
@Spock

Salut, c'est cool que tu débarques, help! Si on aligne les tableaux, ça bugue toujours? SortStructuredArray ?

(pas encore vu ton code)

Re: Coment trier un tableau structuré sur deux champs...

Publié : dim. 06/sept./2015 22:17
par falsam
Spock a écrit :excellent, et mon code ? il marche mon code ? ou bien ?
:mrgreen:
Brayane a écrit :Mais ensuite j'ai mis plus pour voir si ça marchait encore et donc ça ne marchais plus.
Ben fallait rajouter un RSet() à valeur1 comme je l'ai fait pour valeur2
Denis a écrit :Merci de pas écorcher mon prénom également
A mon dieu mais qu'est je fais là ? Au fait .... écorche un peu moins ton français dans ce cas.
Brayane a écrit :"La peau de banane moisie est proche", que veux tu dire par là ?
Que tu viens de glisser dessus. Quel dommage :wink: