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

Delphi Discussion :

Question sur QuickSort d'une TObjectList


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut Question sur QuickSort d'une TObjectList
    Bonjour,

    Il y a quelques temps déjà, j'avais poster sur le forum pour que l'on m'aide à utiliser la méthode Sort du TObjectList.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function compareClassName(item1, item2: pointer): integer;
    begin
      if TObject(item1).ClassName > TObject(item2).ClassName then
        Result := 1
      else if TObject(item1).ClassName < TObject(item2).ClassName then
        Result := -1
      else
        Result := 0;
    end;
    En fait, je trie selon la classe de l'objet qui est soit de type TEntite soit de type TRelation. Le soucis que je viens juste de soulever, c'est que lorsque je trie 2 fois, je perds mon trie de façon alphabétique... En fait, je veux toujours avoir les objets rangé dans cet ordre : TEntite puis TRelation, quelque soit le nombre de fois que je trie

    Si quelqu'un peut m'éclairer ...
    Merci grandement

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Heu, je viens de me rendre compte que j'ai dis une bêtise ... Ca fonctionne bien, mais c'est la fonction qui est pas assez complète...

    Je reformule ma question ...

    J'ai une collection d'objets de type TEntite et TRelation.
    Les objets de type entité possèdent ou non des clés étrangères.

    En fait, je cherche à trier ma collection à avoir d'abord tout les objets de type entité sans clé étrangère, puis ceux avec clé étrangère et enfin les relations.

    J'espère que vous me suivez toujours

    Merci d'avance

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function compareClassName(item1, item2: pointer): integer;
    begin 
     Result:=AnsiCompareText(TObject(item1).ClassName,TObject(item2).ClassName);
     if Result=0 then begin
      if TObject(item1) is TEntite then
       Result:=AnsiCompareText(TEntite(item1).Name,TEntite(item2).Name)
      else
       Result:=AnsiCompareText(TRelation(item1).Name,TRelation(item2).Name)
      if Result=0 then Result:=integer(item1)-integer(item2);
     end;
    end;
    j'ajoute toujours le dernier test sur la valeur du pointeur afin de m'assurer que des homonymes soient toujours présentés dans le même ordre
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Merci encore tothpaul !

    En ce moment, j'avance particulièrement vite grâce à ton aide! C'est plaisant

    Cependant, avant de mettre le sujet en résolu, j'aimerai juste bien cerner le code car j'ai vraiment un peu de mal pour comprendre le fonctionnement du trie QuickSort ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function compareClassName(item1, item2: pointer): integer;
    begin 
     Result:=AnsiCompareText(TObject(item1).ClassName,TObject(item2).ClassName);
     if Result=0 then begin
      if TObject(item1) is TEntite then
       Result:=AnsiCompareText(TEntite(item1).Name,TEntite(item2).Name)
      else
       Result:=AnsiCompareText(TRelation(item1).Name,TRelation(item2).Name);
      if Result=0 then Result:=integer(item1)-integer(item2);
     end;
    end;
    Si j'ai bien saisi, d'abord on compare le 2 de classe des 2 objets.
    Si c'est les même, on regarde si l'objet 1 est de type Entite.
    Et là, je saisi pas vraiment la suite ...
    Une fois encore, on compare le nom de 2 objets mais là tu fais un transtypage de l'objet 2 sans savoir son type ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result:=AnsiCompareText(TEntite(item1).Name,TEntite(item2).Name)
    Aussi, je cerne pas trop cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Result=0 then Result:=integer(item1)-integer(item2);
    Resut=0 c'est pour dire que le nom de l'objet1 et identique à l'objet 2 donc on fait un result qui aura la valeur de la soustraction des pointeurs transtypés en entier ??

    Je suis pas doué ... désolé ... mais comme je dis toujours, copier / coller sans comprendre, ca ne sert à rien.

    Merci d'avance

  5. #5
    Expert confirmé

    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 : 35
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par ero-sennin
    Une fois encore, on compare le nom de 2 objets mais là tu fais un transtypage de l'objet 2 sans savoir son type ...
    Si on arrive là, c'est que l'objet 2 est du même type que l'objet 1, et comme l'objet 1 est un TEntite, l'objet 2 l'est forcément aussi
    Citation Envoyé par ero-sennin
    Resut=0 c'est pour dire que le nom de l'objet1 et identique à l'objet 2 donc on fait un result qui aura la valeur de la soustraction des pointeurs transtypés en entier ??
    Comme il l'a expliqué, c'est juste pour que, si tu fais le tri plusieurs fois, que les objets qui ont même classe et même nom soient retriés à chaque fois dans le même ordre
    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.

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Merci Srjd, c'est vrai que c'était pas bien compliqué
    J'avais mal interprêté le code....

    Ensuite, pour ce qui est de la soustraction, j'ai bien compris que ca allait retourner soit un chiffre >0 ou <0 et j'essaierai de faire des ShowMessage pour voir de façon plus concrète ce que ça peut donner!

    En tous cas, je vous remercie d'avoir éclairé ma lanterne!

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

Discussions similaires

  1. Question sur le filler, une structure et le Z
    Par beegees dans le forum Cobol
    Réponses: 6
    Dernier message: 11/01/2008, 10h50
  2. Réponses: 5
    Dernier message: 22/09/2006, 03h13
  3. Réponses: 2
    Dernier message: 04/12/2005, 21h10
  4. question sur syntaxe d'une requete
    Par sparis dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/09/2005, 11h58
  5. Réponses: 10
    Dernier message: 24/02/2005, 14h57

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