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 :

TList<> et methode compare


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Points
    38
    Par défaut TList<> et methode compare
    J'ai un soucis pour faire fonctionner le tri alphabétique sur une liste générique de couple de chaines de caractères.
    Je pense que mon soucis est dans la méthode de comparaison que je passe au constructeur de la liste.

    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
     
    type
      TMesRecords= record
        Chaine1: String;
        Chaine2: String;
      end;
     
      TListeMesRecords = class
      private
        FListeMesRecords : TList<TMesRecords>;
      public
        constructor Create;
      end;
     
    implementation
     
    constructor TListeMesRecords .Create;
    begin
      FListeFamIso := TList<TMesRecords>.Create(TDelegatedComparer<TMesRecords>.Create(
     function(const Left, Right: TMesRecords): Integer
     begin
       result := CompareText(Left.Chaine1, Right.Chaine1) or CompareText(Left.Chaine2, Right.Chaine2);
     end));
    end;

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    CompareText compare S1 et S2 et renvoie 0 si les deux chaînes sont égales. Si S1 est supérieure à S2, CompareText renvoie un entier supérieur à 0. Si S1 est inférieure à S2, CompareText renvoie un entier inférieur à 0. CompareText n'est pas sensible à la casse et n'est pas affectée par les paramètres régionaux en cours, lors de l'utilisation de la première méthode surchargée CompareText.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result := CompareText(Left.Chaine1, Right.Chaine1) or CompareText(Left.Chaine2, Right.Chaine2);
    ça compile ???
    AH oui ! le or passe en mode binaire et non mode booléen !

    le problème c'est que cela pourrait renvoyer -1 or 1, je crois que cela donne -1 (FFFFFFFF or 1 = FFFFFFFF)

    Tente plutôt (tout dépend si c'est Chaine1 ou Chaine2 qui est la plus importante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Result := CompareText(Left.Chaine1, Right.Chaine1);
    if Result  = 0 then  
      Result := CompareText(Left.Chaine2, Right.Chaine2);

    Je suis assez déclaratif dans mon code,
    Dans mon cas c'est un TObjectDictionary
    Je me suis emmerdé avec un TArray pour trouver le Sort car TObjectDictionary ne fourni pas de Sort (en XE2, je ne l'ai pas trouvé)
    Il est vrai qu'avec le TList c'est plus simple et le Comparer est vraiment pertinent dans le Constructor

    Avec les génériques à fond, cela devient dur à lire !

    voici un extrait (très partiel) où je prototype tout
    Habitué au C++, je fais des sous-types et sous-classes d'une classe principale (c'est ce que l'on appelle une classe interne en Java)

    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
    49
     
      TAutomateLogistiqueBusinessEngine = class(TObject)
      strict private
        type
          TDestinationList = System.Generics.Collections.TObjectDictionary<string, TDestinationInfo>;
          TDestinationListIterator = System.Generics.Collections.TPair<string, TDestinationInfo>;
          TDestinationListOrderer = class(TComparer<TDestinationListIterator>)
          public
            function Compare(const Left, Right: TDestinationListIterator): Integer; override;
          end;
    ...
     
     
    //------------------------------------------------------------------------------
    function TAutomateLogistiqueBusinessEngine.BuildMapTriFromSession(... bla bla ...): Boolean;
    var
      SessionDestinationList: TDestinationList;
      OrderedDestinations: TArray<TDestinationListIterator>;
     
      // * Phase 1 - Récupération des destinations FINALES !
      SessionDestinationList := TDestinationList.Create([doOwnsValues]);
      try
         ... remplissage de SessionDestinationList ...
     
     
        // Calcul du plan selon la quantité
        OrderedDestinations := SessionDestinationList.ToArray();
        DestinationListOrderer := TDestinationListOrderer.Create();
        try
          TArray.Sort<TDestinationListIterator>(OrderedDestinations, DestinationListOrderer);
        finally
          DestinationListOrderer.Free();
        end;
     
     
    ...
     
    { TAutomateLogistiqueBusinessEngine.TDestinationListOrderer }
     
    //------------------------------------------------------------------------------
    function TAutomateLogistiqueBusinessEngine.TDestinationListOrderer.Compare(const Left, Right: TDestinationListIterator): Integer;
    begin
      // Le résultat est inférieur à zéro (<0) : Left est inférieur à Right : Left est plus contient PLUS que Right
      // Le résultat est égal à zéro (=0)      : Left est égal à Right.
      // Le résultat est supérieur à zéro (>0) : Left est supérieur à Right : Left est plus contient MOINS que Right
      // Je veux les plus GROS en premier
      Result := Right.Value.Quantity - Left.Value.Quantity;
    end;
    ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    CompareText renvoie un entier qui peut être -1, 0 ou 1 .

    Je ne comprends pas le "or" entre les deux.

    Serait-il possible d'avoir une explication sur ce que le code est censé trier ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Points
    38
    Par défaut Au temps pour moi
    Bon merci pour vos réponses,

    En fait je me suis un peu "cracké" sur ce coup là effectivement.

    Depuis (après une nuit de sommeil) j'ai codé un truc du style (tel que ShaiLeTroll le recommande) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Result := CompareText(Left.Chaine1, Right.Chaine1);
    if Result  = 0 then  
      Result := CompareText(Left.Chaine2, Right.Chaine2);
    Et ça fonctionne très bien.

Discussions similaires

  1. Methode BinarySearch avec un comparable
    Par loic911 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/04/2008, 07h38
  2. Comparer TList.get et TList[]
    Par Triste dans le forum Débuter
    Réponses: 5
    Dernier message: 19/10/2007, 22h02
  3. Réponses: 5
    Dernier message: 13/02/2007, 08h53
  4. Réponses: 8
    Dernier message: 01/03/2006, 18h41
  5. [Débutant]interface comparable et methode compareto
    Par mariogarcia dans le forum Langage
    Réponses: 5
    Dernier message: 11/01/2006, 09h49

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