Trie d'un tableau à 3 colonne

Forum destiné aux questions sur le développement : Formules, LotusScript, Java ...

Trie d'un tableau à 3 colonne

Messagepar bigBenTem » 07 Juin 2010 à 11:32

Bonjour,

Je suis à la recherche d'un solution de trie pour un tableau à N lignes et 3 colonne sachant que je veux pouvoir trier sur la seconde ou la troisième colonne... sinon c'est pas drôle bien sur!! :(

si quelqu'un a une fonction toute faite je suis preneur!
Avatar de l’utilisateur
bigBenTem
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 105
Inscrit(e) le : 07 Fév 2007 à 11:34
Localisation : Choisy Le Roi

Messagepar Michael DELIQUE » 07 Juin 2010 à 11:35

salut

tu trouvera ici tout un tap de fonctions de tri selon différentes méthodes => http://forum.dominoarea.org/fonctions-de-tris-f55.html

par contre Toutes fonctionnent pour un tableau à 1 dimension:

donc 3 solutions :

- tu concaténes tes 3 colonnes en une
- tu adaptes l'un des fonctions (mais tu va t'amuser à mon avis)
- une vue, trois colonnes et à toi la belle vie
Dernière édition par Michael DELIQUE le 07 Juin 2010 à 12:07, édité 1 fois.
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar bigBenTem » 07 Juin 2010 à 11:45

Merci Michael j'avais bien vue ces fonctions mais effectivement j'avais espéré que le code pour le multidimensionnelle existait!!!
Avatar de l’utilisateur
bigBenTem
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 105
Inscrit(e) le : 07 Fév 2007 à 11:34
Localisation : Choisy Le Roi

Messagepar bigBenTem » 08 Juin 2010 à 15:31

Je craque je ne trouve pas de solution simple et je commence à désespérer!!

J'ai modifié pour arriver à une fonction de tri mono-dimensionnel
j'ai concaténé mes trois colonne en une seul et modifier le code pour test que le premier élément de la concaténation

Code : Tout sélectionner
Sub SortShell(vrTable As Variant)
   
   'Tri par shell par ordre croissant
   
   'Déclaration Variables
   Dim nbUbound As Long
   Dim nbLbound As Long
   Dim nbGap As Long
   Dim i As Long
   Dim J As Long
   Dim vrValue As Variant
   
   On Error Goto ErreurHandle
   
   nbLbound = Lbound(vrTable)
   nbUBound = Ubound(vrTable)
   
   If nbUBound = nbLbound Then
      'si 1 seule donnée pas de traitement
      Exit Sub
   Elseif nbUBound = (nbLbound+1) Then
      'si uniquement 2 données
      If  Cdbl(Strleft(vrTable(nbLbound), ";")) >  Cdbl(Strleft(vrTable(nbUBound), ";")) Then
         vrValue = vrTable(nbUBound)
         vrTable(nbUBound) = vrTable(nbLbound)
         vrTable(nbLbound) = vrValue
         vrValue = Null
      End If
      Exit Sub
   End If   
   
   nbGap = nbLbound
   Do
      nbGap = (3 * nbGap) + 1
   Loop Until nbGap > nbUbound
   
   Do
      nbGap = nbGap \ 3
      For i = nbGap + nbLbound To nbUbound
         vrValue = Cdbl(Strleft(vrTable( i ) , ";"))
         J = i - nbGap
         Do While (Cdbl(Strleft(vrTable(J), ";")) > vrValue)
            vrTable( J + nbGap ) = vrTable( J )
            J = J - nbGap
            If J < nbLbound Then
               Exit Do
            End If   
         Loop
         vrTable( J + nbGap ) = vrTable( i )
         vrValue = Null
      Next
   Loop Until nbGap = 1
   
   Exit Sub
ErreurHandle:
   Msgbox "("+Cstr(Getthreadinfo (1))+" Call by "+Cstr(Getthreadinfo(10))+")"+Chr(10)+"Erreur " + Str(Err) + " : "+Chr(10) + Cstr(Error)+". "+Chr(10)+"Ligne N° "+Cstr(Erl),16," ERREUR !"
   Exit Sub
End Sub


Mon souci est le suivant je lui donne la liste suivante
184,14;465,86;s
84,31;565,69;l
65,43;715,43;xl
218,5;868,5;xxl


Mais une fois le tri fait on a :
84,31;565,69;l
65,43;715,43;xl
184,14;465,86;s
218,5;868,5;xxl


au lieu de
65,43;715,43;xl
84,31;565,69;l
184,14;465,86;s
218,5;868,5;xxl


Une idée ?
Avatar de l’utilisateur
bigBenTem
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 105
Inscrit(e) le : 07 Fév 2007 à 11:34
Localisation : Choisy Le Roi

Messagepar Michael DELIQUE » 08 Juin 2010 à 15:35

salut

si tu ne trie qu'en fonction du premier élément pourquoi te prendre la tete avec le reste ?
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar bigBenTem » 08 Juin 2010 à 15:55

Parce que le reste sont les données dont j'ai besoin en fonction du trie.

Pour faire simple je suis en train de calculer des cotisations pour faire des simulation client.

Et, je pars de la fin, ils nous disent combien il peuvent mettre et je dois trouver la cotisation la plus proche.

La c'est simple j'ai 4 hypothèses donc je calcule tout et je trouve le delta le plus petit (ma première colonne), les deux autres entées sont la cotisation et la formule correspondante...

je veux trier pour avoir le delta mini après les calculs et donc prendre le premier de la liste.
Avatar de l’utilisateur
bigBenTem
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 105
Inscrit(e) le : 07 Fév 2007 à 11:34
Localisation : Choisy Le Roi

Messagepar roubech » 08 Juin 2010 à 21:13

dans un language objet, j'aurai dit :
tu déclares un type 'cotisation' avec tes 3 attributs
tu définits tes opérateurs de comparaison
tu utilises la fonction de tri que tu veux, celle-ci fera appelle aux opérateurs de comparaison
une fois que tes objets sont triés, tu peux les parcourir et accéder aux attributs que tu veux

en LS, avec juste 3 attributs, tu peux feinter en déclarant 2 listes pour les attributs 2 et 3 et ton attribut 1 qui te sert d'index pour le tri, te sert de clé au nivau des 2 listes

à l'arrache, ça pourrait ressembler à :

[syntax="LotusScript"]lstCotis list as Double
lstFormule list as String
tabDelta() as double

tabDelta(0) = 184,14
lstCotis(184,14) = 465,86
lstFormule(184,14) = "s"

tabDelta(1) = 84,31
lstCotis(84,31) = 565,69
lstFormule(84,31) = "l"

...

call sortShell( tabDelta )

i = 0
while x < tabDelta(i) ' and i < ubound(tabDelta)
i = i+1
Wend
cotis = lstCotis(tabDelta(i))
formule = lstFormule(tabDelta(i))
[/syntax]
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Messagepar bigBenTem » 10 Juin 2010 à 09:23

J'ai finalement trouvé une solution qui fonctionne grâce à un collègue je vous livre le fruit de la chose..

Code : Tout sélectionner
   Dim formule_total(0To 3 , 0 To 2) As Variant
   ' Affichage du tableau original
   For i=0 To Ubound( formule_total )
      Select Case i
      Case "0" : formule = "s"
      Case "1" : formule = "l"
      Case "2" : formule = "xl"
      Case "3" : formule = "xxl"
      End Select
      taux = toDouble(Cstr(config_sante.GetItemValue(zone_geo + "_" + formule + "_" + cotisation + "_" + tranche_assure)(0)))
      vtaux = Round(taux*taux_derogation*toDouble(PASS)/100,2)
      formule_total( i, 0 ) = Round(Abs(vtaux - budgetSante),2)
      formule_total( i, 1 ) = vtaux
      formule_total( i, 2 ) = formule
      
      Print "[  [ " & formule_total( i, 0 ) & " ] ; [ "  & formule_total( i, 1 ) & " ] ; [ "  & formule_total( i, 2 ) & " ]  ]</br>"
   Next
   
   ' Tri du tableau
   Print "Sorting table ...."
   Call SortTable( formule_total )
   Print "Table sorted !</br>"
   
   ' Affichage du tableau final
   For i=0 To Ubound( formule_total )
      Print "[  [ " & formule_total( i, 0 ) & " ] ; [ "  & formule_total( i, 1 ) & " ] ; [ "  & formule_total( i, 2 ) & " ]  ]</br>"
   Next


Fonctions appelée :
Code : Tout sélectionner
Function SortTable( tabToSort As Variant )
   Dim sw As Boolean
   Dim i As Integer
   Dim j As Integer
   
   Do
      noSwitch = True
      
      For i=0 To Ubound( tabToSort ) - 1
         If tabToSort( i, 0 ) > tabToSort( i+1, 0 ) Then
            Call SwitchTable( tabToSort, i, i+1 )
            noSwitch = False
         End If
      Next
      
      
   Loop While Not noSwitch
End Function

Sub SwitchTable( tabToSort As Variant, i As Integer, j As Integer )
   tmp1 = tabToSort( i, 0 )
   tmp2 = tabToSort( i, 1 )
   tmp3 = tabToSort( i, 2 )
   
   tabToSort( i, 0 ) = tabToSort( j, 0 )
   tabToSort( i, 1 ) = tabToSort( j, 1 )
   tabToSort( i, 2 ) = tabToSort( j, 2 )
   
   tabToSort( j, 0 ) = tmp1
   tabToSort( j, 1 ) = tmp2
   tabToSort( j, 2 ) = tmp3
End Sub


Voila qui est résolu !!

Merci de l'aide, peut-être que l'on peut le passer en tips :wink:
Avatar de l’utilisateur
bigBenTem
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 105
Inscrit(e) le : 07 Fév 2007 à 11:34
Localisation : Choisy Le Roi

Messagepar Michael DELIQUE » 10 Juin 2010 à 09:27

salut

tu devrais en faire un tips
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar bigBenTem » 10 Juin 2010 à 09:28

J'attendais ton accords pour le passer en tips ;) j'y vais de ce pas!!!!


voila qui est fait!!!!
J'ai modifié le code pour rendre la taille de la matrice paramétrable ainsi que le choix de la colonne permettant le tri! Ce coup-ci on est bon!!!
Avatar de l’utilisateur
bigBenTem
Apprenti-posteur
Apprenti-posteur
 
Message(s) : 105
Inscrit(e) le : 07 Fév 2007 à 11:34
Localisation : Choisy Le Roi


Retour vers Développement

cron