Membres inscrits :598
Membres en ligne : 0
Invités en ligne : 6


|
| Conversation : Ordre des clés d'une multimap |
Alfred83 (Membre)
Lieu: Toulon 83
Inscrit le : 28-12-2007
Messages: 22
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour, Sur un livre que j'édite je construis un index au moyen d'une multimap dont les clés sont les mots indexés. Seul problème, lorsque j'édite mon index les clés sont dans l'ordre ascii, ce qui ne fait pas mon affaire, car je voudrais évidemment l'ordre alphabétique normal et ne pas retrouver les lettres accentuées après x, y, z.
Faut-il que je me lance dans les locales? Ou bien y a-t-il une possiblité de donner une relation d'ordre convenable à la construction de ma multimap? Qui aune idée? Merci d'avance.
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1147
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Salut.
Comment stockes-tu les données ? Dans un wxArrayString ? Est-ce que tu fais le tri au moment de l'ajout, ou une fois que toutes les données ont été ajoutées ?
Je viens effectivement de faire l'essai avec un wxArrayString, et comme tu le dis, les mots commençant par des lettres accentuées se retrouvent en fin de liste avec la méthode de tri normale.
J'ai réussi à faire un tri correct en fournissant ma propre fonction de comparaison à la fonction de tri, mais ça risque de ralentir le tri si comme je le pense, tu dispose d'un grande liste de mots à trier. Il faut en effet remplacer les caractères accentués avant de faire la comparaison, pour que ça marche.
Voici ce que ça donne :
Code wxWidgets:static wxString FormatStringBeforeCompare(const wxString& value) { static wxChar* ch1[] = {_T("é"), _T("è"), _T("ê"), _T("à"), _T("ù")}; static wxChar* ch2[] = {_T("e"), _T("e"), _T("e"), _T("a"), _T("u")}; static size_t ln=sizeof(ch1)/sizeof(wxChar*); wxString result = value.Lower(); for (size_t i=0;i<ln;i++) result.Replace(ch1[i], ch2[i], true); return result; } static int MyCompareFunction(const wxString& first, const wxString& second) { wxString f=FormatStringBeforeCompare(first); wxString s=FormatStringBeforeCompare(second); return f.CmpNoCase(s); } void MainFrame::OnTest(wxCommandEvent &event) { wxArrayString items; items.Add(_T("éléctricité")); items.Add(_T("entonnoir")); items.Add(_T("fusil")); items.Add(_T("douve")); wxArrayString sorted1=items; sorted1.Sort(); wxArrayString sorted2=items; sorted2.Sort(MyCompareFunction); //Résultats avec les deux méthodes de tri : // Méthode 1 Méthode 2 // douve douve // entonnoir éléctricité // fusil entonnoir // éléctricité fusil }
Après, c'est à toi de voir si tu fais tous les remplacements de caractères ou pas.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
Alfred83 (Membre)
Lieu: Toulon 83
Inscrit le : 28-12-2007
Messages: 22
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour et merci de ta réponse.
Les données sont stockées dans la multimap, chaque élément (mot indexé, page) est inséré dans la multimap au fur et à mesure de la construction des pages du livre. Lorsque toutes les pages sont traitées j'édite ma multimap en utilisant une boucle de MapIndex.begin() à MapIndex.end(). Je ne touche pas à l'ordre des clés à la construction. Or s'il y avait une possibilité de modifier cette relation d'ordre, ce serait la solution la plus élégante.
Le temps n'est pas un problème, malgré leur complexité et les nouvelles demandes de mes utilisateurs (je suis bénévole!!!), mes programmes sont très rapides de l'ordre de la minute pour un livre moyen. D'autre part le besoin de cet index sera très exceptionnel.
En m'inspirant de ta solution, je vais créer une map (Cle_Sans_Accent, Clé_Reelle) et une multimap (Cle_Sans_Accent, page). Celle-ci sera d'office ordonnée pour l'édition, il me suffira de remplacer la Cle_Sans_Accent par la Clé_Reelle au moment de l'écrire. Cle_Sans_Accent étant obtenue en remplaçant les lettres accentuées par des lettres non accentuées.
Il restera une erreur négligeable: é, è, ê ne seront pas classés entre elles...
Cela devrait faire l'affaire... A suivre. ---------- Finalement j'ai résolu mon problème de tri alphabétique en utilisant un multimap avec pour clé CleSansAccent_Cléaccentuée. Les clés sont dans l'ordre désirée et je n'édite que la partie "Cléaccentuée". Si cela peut présenter un intéret, je peux en faire un snippet "Tri alphabétique en français"?
Cordialement.
Dernière modification par Alfred83 (28-11-2009 16:31:52)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1147
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Alfred83 a écrit:Si cela peut présenter un intéret, je peux en faire un snippet "Tri alphabétique en français"? Avec plaisir.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
|