wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

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

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1 Discussion fermée
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» Ordre des clés d'une multimap
Conversation : Ordre des clés d'une multimap
03-11-2009 19:46:06  Ordre des clés d'une multimap #1
Alfred83 (Membre)
Lieu: Toulon 83
Inscrit le : 28-12-2007
Messages: 42
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.

Informaticien bénévole du "Groupement des Intellectuels Aveugles ou Amblyopes" à Toulon, qui publie les trois quarts des livres en braille en France.
04-11-2009 09:10:46  Re: Ordre des clés d'une multimap #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
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à...
05-11-2009 10:25:00  Re: Ordre des clés d'une multimap #3
Alfred83 (Membre)
Lieu: Toulon 83
Inscrit le : 28-12-2007
Messages: 42
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)


Informaticien bénévole du "Groupement des Intellectuels Aveugles ou Amblyopes" à Toulon, qui publie les trois quarts des livres en braille en France.
30-11-2009 07:42:49  Re: Ordre des clés d'une multimap #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1383
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Alfred83:
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à...
Menu forum (navigation):
Pages: 1 Discussion fermée
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» Ordre des clés d'une multimap