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 :

Tris multiples sur Objets


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut Tris multiples sur Objets
    Bonjour,

    Mon but est de trier une liste d'objets sur plusieurs champs de ces objets.

    J'ai créé une liste spécifique heritée de TList qui contient uniquement le même type d'objet.

    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
      { TListeMaClass }
      TListeMaClass = class(TList)
      private
        FOwnsObjects: Boolean;
      protected
        function GetItem(Index: Integer): TMaClass;
        procedure Notify(Ptr: Pointer; Action: TListNotification); override;
      public
        constructor Create(AOwnsObjects: Boolean); overload;
        function Add(AMaClass: TMaClass): Integer;
        // Extract supprime un objet de la liste sans le libéré et retourne cet objet
        function Extract(Item: TMaClass): TMaClass;
        // Remove supprime un objet de la liste en le libérant et retourne son indice avant destruction
        function Remove(AMaClass: TMaClass): Integer;
        function IndexOf(AMaClass: TMaClass): Integer;
        function First: TMaClass;
        function Last: TMaClass;
        procedure Insert(Index: Integer; AMaClass: TMaClass);
        // Efface la liste et crée une copie de chaque objet de la liste passée en paramètre
        // et les ajoute à la liste
        procedure Assign(AListA: TListeMaClass);
        property Items[Index: Integer]: TMaClass read GetItem; default;
        property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;
      end;

    Imaginons ma Classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      TMaClass = class
      private
        FChamps1: String;
        FChamps2: Integer;
        FChamps3: Real;
      public
        property Champs1: String read FChamps1 write FChamps1;
        property Champs2: String read FChamps2 write FChamps2;
        property Champs3: String read FChamps3 write FChamps3;
      end;
    Je voudrais pouvoir trier ma liste sur le Champs1 puis Champs2 puis Champs3

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    MaClass1.Champs1 := 'BB'; 
    MaClass2.Champs1 := 'AA'; 
    MaClass3.Champs1 := 'AA'; 
    MaClass4.Champs1 := 'AA'; 
    MaClass1.Champs2 := 2; 
    MaClass2.Champs2 := 4; 
    MaClass3.Champs2 := 4; 
    MaClass4.Champs2 := 2; 
    MaClass1.Champs3 := 2.5; 
    MaClass2.Champs3 := 2.2; 
    MaClass3.Champs3 := 2.1; 
    MaClass4.Champs3 := 2.1;
    Après le tri des champs(1, 2, 3) mes objets MaClass devront être dans l'ordre MaClass4, MaClass3, MaClass2, MaClass1.

    J'ai essayé avec des Sort genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function CompareChamps1(Item1, Item2: Pointer): Integer;
    begin
      Result := CompareStr(TMaClass(Item1).Champs1, TMaClass(Item2).Champs1);
    end;
    ...
     
    procedure TListeMaClass.Tri123;
    begin
      Sort(@CompareChamps3);
      Sort(@CompareChamps2);
      Sort(@CompareChamps1);
    end;
    mais les sorts qui suivent ne gardent pas celui des précédents.

    Quelqu'un aurait déjà fait des tris sur plusieurs champs ?

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En faisant une triple comparaison dans une seule routine 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
    14
    function CompareChamps(Item1, Item2: Pointer): Integer;
    begin
      Result := CompareStr(TMaClass(Item1).Champs1, TMaClass(Item2).Champs1);
      if Result = 0 then
        Result := CompareStr(TMaClass(Item1).Champs2, TMaClass(Item2).Champs2);
      if Result = 0 then
        Result := CompareStr(TMaClass(Item1).Champs3, TMaClass(Item2).Champs3);
     end;
    ...
     
    procedure TListeMaClass.Tri123;
    begin
      Sort(@CompareChamps);
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre régulier
    Profil pro
    Ingenieur developpement
    Inscrit en
    Septembre 2002
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingenieur developpement

    Informations forums :
    Inscription : Septembre 2002
    Messages : 175
    Points : 106
    Points
    106
    Par défaut
    merci à toi jeune mais talentueux Padawan. Je vois que la force est avec toi. .
    Cela fonctionne très bien. Il ne me reste plus qu'a faire un paramétrage pour l'ordre de tri

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

Discussions similaires

  1. tri multiple sur array()
    Par proxichou dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2010, 14h24
  2. Réponses: 10
    Dernier message: 31/07/2010, 12h00
  3. Requete sur tri multiple
    Par Guillaume C dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/11/2007, 11h59
  4. pointeur multiple sur un objet
    Par Arnaud-h dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/06/2004, 11h33
  5. Réponses: 2
    Dernier message: 08/04/2004, 16h30

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