Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trié des string par ordre alphabétique

Sujet résolu
    29 septembre 2008 à 20:35:41

    Bonjour

    Je vous expose la situation :
    J'ai un fichier qui contient un mot par ligne. Certains de ces mots commencent par une majuscule.
    Je voudrais trier par ordre alphabétique ces mots.

    J'ai bien évidemment fait quelques recherches mais tous les scripts que j'ai trouvé classent les mots en commençant par ceux en majuscules (car ils se basent sur la table ASCII).

    Exemple :

    Liste non triée
    • Zozor
    • maurice
    • Ludovic
    • Albert
    • andre
    • Toto
    • ginette

    Liste trié (façon ASCII)
    • Albert
    • Ludovic
    • Toto
    • Zozor
    • andre
    • ginette
    • maurice
    </span>
    Liste trié (je voudrais que ce soit comme ça)
    • Albert
    • andre
    • ginette
    • Ludovic
    • maurice
    • Toto
    • Zozor
    </span>

    Voilà, donc si vous avez une idée ;) Merci d'avance !

    PS : Dans les scripts que j'ai vu, ils utilisent des vectors (Mais je ne sais pas exactement ce que c'est...)
    • Partager sur Facebook
    • Partager sur Twitter
      29 septembre 2008 à 20:49:11

      salut!
      tu peux utiliser une std::list<std::string>
      => cplusplus
      • Partager sur Facebook
      • Partager sur Twitter
        29 septembre 2008 à 21:16:53

        Merci mixav ! L'exemple de la doc fait exactement ce que je veux. Par contre je ne comprends pas comment ça marche. En particulier c'est 2 lignes :
        list<string> mylist;
        list<string>::iterator it;

        C'est bizarre comme syntaxe :p Aurais-tu le temps de m'expliquer ce que c'est ? :p
        • Partager sur Facebook
        • Partager sur Twitter
          29 septembre 2008 à 21:20:52

          Exemple avec un vecteur:
          std::vector<std::string> v;
          // remplissage du vecteur...
          std::sort(v.begin(), v.end());
          // ici, le vecteur est trié
          
          • Partager sur Facebook
          • Partager sur Twitter
            29 septembre 2008 à 21:28:44

            Merci à vous 2 ;)
            Je vais lire ce tuto vector qui à l'air très bien. Comme ça mon code fonctionne et je le comprends, c'est préférable quand même ^^
            • Partager sur Facebook
            • Partager sur Twitter
              30 septembre 2008 à 21:38:01

              Bonsoir les amis !

              Bon c'est une catastrophe :lol: Ca fait plusieurs heures que j'essaie d'intégrer ce code dans mon programme... (C'est l'exemple tirer de la doc)

              // list::sort
              #include <iostream>
              #include <list>
              #include <string>
              #include <cctype>
              using namespace std;
              
              // comparison, not case sensitive.
              bool compare_nocase (string first, string second)
              {
                unsigned int i=0;
                while ( (i<first.length()) && (i<second.length()) )
                {
                  if (tolower(first[i])<tolower(second[i])) return true;
                  else if (tolower(first[i])>tolower(second[i])) return false;
                  ++i;
                }
                if (first.length()<second.length()) return true;
                else return false;
              }
              
              int main ()
              {
                list<string> mylist;
                list<string>::iterator it;
                mylist.push_back ("one");
                mylist.push_back ("two");
                mylist.push_back ("Three");
              
                mylist.sort();
              
                cout << "mylist contains:";
                for (it=mylist.begin(); it!=mylist.end(); ++it)
                  cout << " " << *it;
                cout << endl;
              
                mylist.sort(compare_nocase);
              
                cout << "mylist contains:";
                for (it=mylist.begin(); it!=mylist.end(); ++it)
                  cout << " " << *it;
                cout << endl;
              
                return 0;
              }
              



              A mon avis le problème vient de cette ligne :
              mylist.sort(compare_nocase);
              


              Vous pourriez m'expliquer un peu comment ça marche ? Je me suis documenté sur les iterateurs, sur les "list", etc. Mais je comprends pas ce bout de code. C'est quoi qui est envoyé réellement à la fonction sort ? D'où sorte les string first et second que compare_nocase récupère en paramètres ?

              Ensuite, est-ce possible de convertir *it en QString ?

              Beaucoup de questions en sommes :p

              Voilà j'espère avoir été assez compréhensible ^^
              Merci à vous.
              • Partager sur Facebook
              • Partager sur Twitter
                30 septembre 2008 à 23:46:00

                Pas besoin de tant de complexité... tu appelle simplement std::sort en précisant le début et la fin de ta séquence (begin() et end()). That's it.

                L'exemple que tu as pris utilise un prédicat (par défaut, std::sort utilise l'opérateur <, il trie donc en ordre croissant) permettant de classer les chaînes en ignorant la casse (par défaut, les comparaisons de chaînes font la différence entre les majuscules et les minuscules).

                Quant à *it... dans l'exemple it est un itérateur sur un élément d'une liste de std::string. Donc, *it est une std::string. Il doit bien y avoir une méthode dans la doc de Qt pour convertir une std::string en QString...
                • Partager sur Facebook
                • Partager sur Twitter
                  1 octobre 2008 à 0:22:13

                  Merci Ice_Keese !

                  Pour le *it ça marche nickel.

                  Par contre, au risque de paraître un peu lourd :p je ne comprends toujours pas pour sort...

                  je suis obligé d'utiliser l'implémentation de l'exemple car je veux absolument que le classement ignore la casse !!

                  Voici l'insulte du compilo :
                  FenCorrespondances.cpp:327: error: no matching function for call to `std::list<std::string, std::allocator<std::string> >::sort(<unknown type>)'

                  Ma ligne 327 : mylist.sort(compare_nocase);

                  Donc je résume cette ligne est acceptée quand je compile l'exemple mais ça ne compile pas dans mon programme alors que c'est la même chose...

                  Merci encore ;)


                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 octobre 2008 à 0:57:30

                    Remplace la ligne 327 par:
                    std::sort(mylist.begin(), mylist.end(), compare_nocase);
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 octobre 2008 à 2:59:07

                      std::sort est inefficace sur les listes.
                      Autant avoir un std::set dès le début.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                        1 octobre 2008 à 20:12:49

                        Ice_Keese > encore une erreur à la même ligne...

                        FenCorrespondances.cpp:327: error: no matching function for call to `sort(std:List_iterator<std::string>, std::_List_iterator<std::string>, <unknown type>)'

                        lmghs > il est efficace puisque dans le code d'exemple de la doc, ça fonctionne très bien...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 octobre 2008 à 22:21:11

                          Il est inefficace car il réalise O(n^2) parcours (IIRC) pour O(n ln n) comparaisons entre les value_type. Quand on veut trier, on préfère les conteneurs qui offrent un accès direct (en O(1)), ou ceux qui sont triés par nature (tous les arbres -> std::set, std::map)

                          <edit>Qui plus est, quand un conteneur offre une fonction membre sort, c'est celle-ci et non la libre qu'il convient d'utiliser.</>

                          Côté doc ... celle donnée en lien ne fait pas parti du trio que j'utilise (dinkumware, SGI, roguewave ; et GCC pour le coup de de coeur)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                            2 octobre 2008 à 9:37:03

                            OK je vais essayer avec sort(). Merci pour votre aide :)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Trié des string par ordre alphabétique

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown