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

C++Builder Discussion :

[ListView] tri particulier (comparaison numérique) [Sources]


Sujet :

C++Builder

  1. #1
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut [ListView] tri particulier (comparaison numérique)
    Bonjour,

    J'utilise la méthode Alphasort() pour trier des mots.
    Mais je n'ai pas trouvé la méthode équivalente pour trier des nombres.

    Pouvez vous me renseigner.
    merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    Salut,

    je sais pas si il existe une telle methode pour trier les nombres, mais ce que je te propose est de faire une fonction qui converti tes nombres en AnsiString, de les triers, puis de les retransformer en int...

    ++

  3. #3
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Merci de ta réponse.

    Mais en faisant cela , après tri, je ne vais pas avoir par exemple cela:

    1
    10
    2

    au lieu de
    1
    2
    10

    En effet si je passe en ansistring, il va comparer caractere par caractere pour le tri non?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 45
    Points : 25
    Points
    25
    Par défaut
    oui, en effet, je suis trop con :-)
    dsl

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Mais non t'es pas trop con.

    J'ai fait aussi cette erreur, c'est pour sa que j'ai vu que sa marchait pas..

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En standard il y a std::sort pour trier n'importe quoi. Inclure <algorithm>.

  7. #7
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Merci de ta réponse.

    Mais je ne vois pas trop comment l'utiliser. Je travaille avec des listviews à plusieurs colonnes.
    Merci de me donner une piste.

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Points : 635
    Points
    635
    Par défaut
    Sinon méthode intermédiaire, tu peux regarder le nombre de chiffres max que tu as et tu rajoute le nombre de zéros manquants en concéquence, comme ca tu aura bien :
    01
    02
    10

    Et ensuite quand tu le repasse en int à mon avis le 0 saute (mais c'est à confirmer quand même)

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Cybher
    Mais je ne vois pas trop comment l'utiliser. Je travaille avec des listviews à plusieurs colonnes.
    Ah, hum... Quel est le type exact des données que tu veux trier ? Elles sont stockées dans quel genre de conteneur ?

    Pour ce qui est du fonctionnement de std::sort, elle prend en paramètre une paire d'itérateurs sur la séquence à trier, et si on souhaite faire un tri utilisant un critère perso (c'est l'opérateur < par défaut qui est utilisé), on peut passer en troisième paramètre un foncteur (voir la FAQ C++).

  10. #10
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    J'ai une listview d'environ 400 lignes.
    en fait, j'ai plusieurs colonnes dans ma listview: certaines colonnes contiennent du tecte, d'autres des nombres.
    en cliquant sur une colonne, je voudrais trier selon cette colonne.
    pour du texte j'ai réussi mais le problème vient quand je veux trier les nombres.
    je n'aarive pas à le faire par nombre croissant.
    je continue mes recherches
    encore merci pour votre aide
    je vais tester les méthodes proposées.

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Tu as un exemple mutli-thread avec 3 types de tris différents dans le dossier Exemples de C++ Builder.

    Sinon tu cherches avec ton ami quelque chose comme
    "tri rapide algorithme"
    et il devrait te sortir quelque chose de symapthique
    Neilos

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Dans la fonction que tu utilises pour la comparaison des éléments, tu peux sans doute distinguer les 3 cas suivants:
    cas 1 : les deux élements sont numériques => tu renvoies la comparaison des nombes correspondants
    cas 2 : les deux éléments sont alphabétiques => tu renvoies la comparaison des chaînes correspondantes
    cas 3 : l'un est numérique l'autre est alphabétique, tu renvoies le fait que le nombre est "plus petit" que la chaîne
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    merci de vos réponses

    en fait je n'ai que le cas 1 ou 2.

    Sachant que je n'ai pas de porblème pour les éléments alphabétiques.
    Il me reste les éléments numériques.
    Je verrai sa un peu plus tard car je suis en stage et on m'a demandé de passer à autre chose pour le moment.(il n'a que cela qui ne fonctionnait pas)
    mais j'essaierais de regardé entre deux.

    Merci de vos conseils.

  14. #14
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    Pour plus tard, donc
    Il te faut implémenter le gestionnaire d'événements OnCompare du ListView. Il est appelé pour comparer un élément à un autre, même avec AlphaSort. De la sorte que tu peux appeler AlphaSort même pour trier des valeurs numériques, il s'agit pour toi d'écrire le gestionnaire adéquat (conversion de l'AnsiString en int et comparaison par exemple).

    Cordialement,

    Arnaud

  15. #15
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Juste en passant, une proposition d'implémentation :

    Prérequis : pour chaque colonne du TListView, positionner sa propriété Tag à 0 si il faut faire une comparaison de chaînes, à toute autre valeur pour une comparaison numérique

    gestionnaire d'événements OnColumnClick
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // mémorisation de la colonne à trier
    ((TListView*) Sender)->Tag = Column->Index;
    // déclenchement du tri
    ((TListView*) Sender)->AlphaSort();
    gestionnaire d'événements OnCompare
    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
     
    TListView * lst = (TListView *) Sender;
    if (lst->Columns->Items[lst->Tag]->Tag == 0) // Comparaison chaînes
    {
       AnsiString A1;
       AnsiString A2;
       if (lst->Tag == 0)
       {
          A1 = Item1->Caption;
          A2 = Item2->Caption;
       }
       else
       {
          A1 = Item1->SubItems->Strings[lst->Tag - 1];
          A2 = Item2->SubItems->Strings[lst->Tag - 1];
       }
       Compare = AnsiCompareStr(A1,A2);
    }
    else // comparaison numérique
    {
       int I1;
       int I2;
       if (lst->Tag == 0)
       {
          I1 = Item1->Caption.ToInt();
          I2 = Item2->Caption.ToInt();
       }
       else
       {
          I1 = Item1->SubItems->Strings[lst->Tag - 1].ToInt();
          I2 = Item2->SubItems->Strings[lst->Tag - 1].ToInt();
       }
       Compare = I1 - I2;
    }

  16. #16
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Merci GreyBird,

    J'utilisais en effet l'événement on compare pour mon alphasort.
    J'essai de regarder cela ce midi.

    Merci pour vos aides.

  17. #17
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Et bien sa fonctionne!!
    Au risque de me répéter merci à tous et en particulier à GreyBird!
    Sa méthode fonctionne parfaitement.

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

Discussions similaires

  1. Tri particulier dans un état
    Par clonezoë dans le forum IHM
    Réponses: 5
    Dernier message: 28/11/2007, 12h30
  2. [WPF] Listview tri et databinding
    Par Jérem22 dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 26/09/2007, 14h08
  3. Listview trié sur plus d'une colonne
    Par Duan dans le forum Delphi
    Réponses: 2
    Dernier message: 26/05/2006, 03h29
  4. Réponses: 4
    Dernier message: 16/12/2005, 17h43
  5. [VB6][ListView] Tri sur chaque colonne
    Par frlap dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 26/05/2004, 11h20

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