Bonjour a tous, question simple mais je ne trouve pas de reponse.
J'ai une list de ce genre :
A3
C3
AA3
AB3
Z3
Y3
et lorsque j'utilise le fameux qsort j'obtiens :
A3
AA3
AB3
C3
Y3
Z3
Alors que je voudrais
A3
C3
Y3
Z3
AA3
AB3
Comment faire ? :/
Version imprimable
Bonjour a tous, question simple mais je ne trouve pas de reponse.
J'ai une list de ce genre :
A3
C3
AA3
AB3
Z3
Y3
et lorsque j'utilise le fameux qsort j'obtiens :
A3
AA3
AB3
C3
Y3
Z3
Alors que je voudrais
A3
C3
Y3
Z3
AA3
AB3
Comment faire ? :/
Bonjour,
Si tu regardes bien le man de qsort, tu verras que tu peux définir une fonction de comparaison.
EDIT : oups encore confondu entre C et C++... Bon dans les deux cas on peut définir une fonction de comparaisons^^
Bonjour,
il te faut utiliser ton propre prédicat de comparaison.
Merci de ta rapidite, mais etant encore debutant en c++, j'avoue que tu me parles un peu chinois la.
J'ai trouve ca, mais j'avoue ne pas savoir quoi faire avec....
Code:
1
2
3
4
5
6
7
8
9
10
11
12 bool caseInsensitiveLessThan(const QString &s1, const QString &s2) { return s1.toLower() < s2.toLower(); } int doSomething() { QStringList list; list << "AlPha" << "beTA" << "gamma" << "DELTA"; qSort(list.begin(), list.end(), caseInsensitiveLessThan); // list: [ "AlPha", "beTA", "DELTA", "gamma" ] }
Tu ne veux pas trier par ordre alphabétique mais trier par ordre numérique en base 36 (?)
Donc tu peux en premier lieu comparer la taille de tes chaînes et si elles sont égales, comparées tes chaînes avec l'opérateur < (ou >).
ok donc éventuellement je pourrai faire ca ? :
Pour signifier que les "doubles" lettres doivent se placer apres les simples ?Code:
1
2
3
4 bool MafonctionDeComparaisonQueJeVeux() { return z<aa; }
Ca me parait un peu trop simple...
De plus ou definir cette nouvelle methode ?
Code:
1
2
3
4
5
6
7
8 int doSomething(const QString &str1, const QString &str2) { if (str1.length() != str2.length()) return (str1.length() < str2.length()); else return (str1.toLower() < str2.toLower()); }
qsort prend un pointeur sur fonction int MyMethod(const void*a, const void*b) qui doit retourner -1 si a < b, 0 si a == b, +1 si a > b
http://en.cppreference.com/w/cpp/algorithm/qsort
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
Pour l'emplacement de la fonction, il faut la mettre juste avant la déclaration de la fonction appelante à cette dernière. (bon c'est vrai que d’après ton exemple j'aurais du l appelaisdonc rectification :Code:caseInsensitiveLessThan()
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int caseInsensitiveLessThan(const QString &str1, const QString &str2) { if (str1.length() != str2.length()) return (str1.length() < str2.length()); else return (str1.toLower() < str2.toLower()); } int doSomething() { QStringList list; list << "AlPha" << "beTA" << "gamma" << "DELTA"; qSort(list.begin(), list.end(), caseInsensitiveLessThan); }
Bien qu'il ait déniché un code avec des QString, ça m'étonnerait que delta07 utilise Qt... Pour l'instant j'ai l'impression qu'il utilise qsort "par dessus la jambe" et qu'il compare seulement les premiers caractères des chaînes.
On peut avoir plus d'infos sur le type des tes listes (tableaux C, std::vector, std::list ?) et des chaînes qu'elles contiennent (char*, std::string) ?
Alors effectivement je suis sous qt, et je connais assez peu le c++.
Je dois travailler sur une grosse application divise en moult fichier.
Mon travail pour l'instant et de remplir un fichier excel ( je vous passe les details)
La, j'ai donc une QList <String> contenant mes colones de mon excel mais sur une seul ligne (ex : A3,D3,AA3,Z3,T3,B3,etc)
Je dois reussir a en sortir une QList de type A3,B3,C3,...Z3,AA3,AB3,...
Alors que pour le moment j'arrive a trier comme ceci :A3,AA3,AB3,C3,Y3,Z3
Je dois livrer mes fonctions pour demain soir et j'avoue que je me perd dans la doc et dans la comprehension general du c++.
Ok...mes neurones viennent de se connecter...
Effectivement la fonction de BloodH mise au bon endroit fonctionne parfaitement.
Des que j'aurais du temps je vais lire attentivement vos different liens, parce que je n'ai pas tout compris.
Merci beaucoup en tous cas.
Faut faire attention aux differences entre qsort de la C++ et qsort repris dans Qt.