IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Tri d'un tableau sur une colonne


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Tri d'un tableau sur une colonne
    Hello,

    Je poste ce sujet pour ne pas réinventer la roue.

    Je voudrais trier le tableau dynamique déclaré comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShapeList : Array of Array of Integer;
    et dimensionné par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SetLength(ShapeList, Length(TmpPolygList), 3);
    Chaque ligne du tableau est affectée de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        For i := 0 to Length(TmpPolygList) - 1 do
        begin
          .
          .
          ShapeList[i, 0] := NoPolyg;
          ShapeList[i, 1] := NoLine;
          ShapeList[i, 2] := Round(LenSegm);
          .
          .
      end
    Je voudrais que mon tableau soit trié sur la 3ème colonne.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Regarde la function CustomSort d'une TList, prend le code et adapte le à ton tableau ...

  3. #3
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShapeList : Array of Array of Integer;
    Je pense qu'il sera mieux si tu déclare ton tableau comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
     PMyType=^TMyType;
     TMyType= record
      Champ1:integer;
      Champ2:integer;
      Champ3:integer;
     end;
    TMyTypeArray=array of TMyType;
    var
    ShapeList : TMyTypeArray;
    dimension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetLength(ShapeList, Length(TmpPolygList));
    affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i := 0 to Length(TmpPolygList) - 1 do
        begin
          .
          .
          ShapeList[i].Champ1 := NoPolyg;
          ShapeList[i].Champ2 := NoLine;
          ShapeList[i].Champ3 := Round(LenSegm);
          .
          .
      end
    fonction de comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function comparer(Item1,Item2:Pointer): Integer;
    var
     P1,P2:PMyType;
    begin
         P1:=Item1;
         P2:=Item2;
        if P1^.Champ3 > P2^.Champ3 then
           Result := 1
        else if P1^.Champ3 = P2^.Champ3 then
          Result :=  0
        else
          Result := -1;
    end;
    fonctions de trie Bulle pour les tableaux de petite taille et QuickSort pour les gandes tailles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    procedure QuickSort(var SortList:TMyTypeArray; L, R: Integer;
      SCompare: TListSortCompare);
    var
      I, J: Integer;
      P, T: TMyType;
    begin
      repeat
        I := L;
        J := R;
        P := SortList[(L + R) shr 1];
        repeat
          while SCompare(@SortList[I], @P) < 0 do
            Inc(I);
          while SCompare(@SortList[J], @P) > 0 do
            Dec(J);
          if I <= J then
          begin
            T := SortList[I];
            SortList[I] := SortList[J];
            SortList[J] := T;
            Inc(I);
            Dec(J);
          end;
        until I > J;
        if L < J then
          QuickSort(SortList, L, J, SCompare);
        L := I;
      until I >= R;
    end;
    procedure Bulle(var SortList:TMyTypeArray ;L, R: Integer;
      SCompare: TListSortCompare);
    var
      I:Integer;
      Permut:boolean;
      T: TMyType;
    begin
      repeat
            Permut:=false;
           for I:=L to R-1 do
           if SCompare(@SortList[I],@SortList[I+1])=1 then
             begin
              T:=SortList[I];
              SortList[I]:=SortList[I+1];
              SortList[I+1]:=T;
              Permut:=true;
             end;
      until not Permut;
    end;
    Opération de trie avec Bulle ou QuickSort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bulle(ShapeList,0,Length(ShapeList)-1,comparer);
    //QuickSort(ShapeList,0,Length(ShapeList)-1,comparer);
    Si tu veux utiliser un Tlist comme Shai a proposé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
     i:integer;
     element:PMyType;
    begin
        For i := 0 to Length(TmpPolygList) - 1 do
        begin
          new(element);
          element^.Champ1:=NoPolyg;
          element^.Champ2:=NoLine;
          element^.Champ3:=Round(LenSegm);
          ShapeList.Add(element);
        end;
        ShapeList.Sort(comparer);
    pour supprimer les elements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i := 0 to ShapeList.Count - 1 do
        Dispose(ShapeList[i]);

  4. #4
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    C'est super complet.

    Un tout grand merci.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 831
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 831
    Points : 13 579
    Points
    13 579
    Par défaut
    Si tu as vraiment un gros tableau, tu pourrais aussi créer un 2ème tableau te servant d'index. Un TSegmentIndex à deux dimensions. La 1ère étant le nombre de segments et la 2ème un index sur ta ShapeList.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri sur une colonne d'un tableau
    Par dubis dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 08/12/2012, 07h46
  2. Réponses: 2
    Dernier message: 26/10/2012, 15h59
  3. Réponses: 8
    Dernier message: 23/05/2012, 21h24
  4. tri sur une colonne
    Par cubepiege dans le forum Langage SQL
    Réponses: 11
    Dernier message: 13/07/2006, 13h16
  5. [JSP] tri sur une colonne
    Par soony dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/07/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo