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

Collection et Stream Java Discussion :

Tri alphabétique d'un TreeMap dont les clés sont des String


Sujet :

Collection et Stream Java

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut Tri alphabétique d'un TreeMap dont les clés sont des String
    Bonjour,
    j'ai un TreeMap contenant des String en tant que clés. Par défaut l'ordre de tri naturel est 0-9, A-Z, a-z, àçéêè, etc...

    Je voudrais trier ce TreeMap par ordre alphabétique "français", comme dans un dictionnaire basique, à savoir : 0-9, a|A|à, B|b, c|ç|C|Ç, etc.
    (le "|" signifie 'ou')
    ce qui donne pour exemple avec les clés suivantes :
    - 5246
    - à
    - Ambre
    - arbre
    - Baobab
    - bus
    - Butte
    - Ça
    - ça
    - carte
    etc.

    En gros un tri insensible à la casse et aux accents.
    Je sais que l'on peut passer un Comparator au constructeur du TreeMap mais je ne pense pas qu'il faille redéfinir le compareTo de la classe String en fonction de tous les caractères accentués ?
    J'ai vu aussi que la méthode compare() de la classe Collator pourrait m'être utile mais je ne vois pas comment lier le TreeMap et le Collator.
    Donc voilà, si quelqu'un à n'importe quelle piste je suis preneur
    Merci d'avance et a+

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Re: Tri alphabétique d'un TreeMap contenant des String
    Salut,

    Citation Envoyé par Djakisback
    J'ai vu aussi que la méthode compare() de la classe Collator pourrait m'être utile mais je ne vois pas comment lier le TreeMap et le Collator.
    Collator implémente Comparator, tu peux donc l'utiliser dans le constructeur de ta TreeMap. Ainsi ceci permet de trier selon les règles d'usages en français :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map m = new TreeMap(Collator.getInstance(Locale.FRENCH));
    Et tu peux faire simplement ceci si tu veux trier selon la locale de l'utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map m = new TreeMap(Collator.getInstance());

    Enfin si ces règles ne te conviennent pas tu peux définir les tiennes via la classe RuleBasedCollator...

    a++

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Merci beaucoup ca trie exactement comme je voulais . Intéressante cette classe RuleBasedCollator je vais regarder cela en détails.

    J'essaie de créer un lexique. Je parse un fichier XML et ajoute dans un TreeMap : mot -> nb_apparitions
    ex :
    bus -> 12
    le -> 125
    etc.

    En passant Collator.getInstance(Locale.FRENCH) au TreeMap, pour une tâche contenant environ 300 000 appels TreeMap.put(), cela multiplie par 20 la durée de la tâche :/
    Cela me paraît un peu lourd et bizzare.

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Le tri s'effectuant de nouveau à chaque appel de put() et n'ayant besoin du TreeMap trié qu'une fois qu'il est complètement rempli, quelqu'un aurait-il une méthode pour créer un TreeMap depuis un HashMap temporaire mais en fournissant en plus un Comparator ?
    Le constructeur TreeMap(Map m, Comparator c) n'existant pas je ne vois pas comment l'on peut faire.
    Merci ^^

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Bon j'ai simplement fait une copie par itération et ca fonctionne très bien.
    Bye

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Djakisback
    En passant Collator.getInstance(Locale.FRENCH) au TreeMap, pour une tâche contenant environ 300 000 appels TreeMap.put(), cela multiplie par 20 la durée de la tâche :/
    Cela me paraît un peu lourd et bizzare.
    Mais c'est normal car chaque appel à put() effectuera au minimum une comparaison (et surement plus). Et comme la méthode de comparaison de Collator est beaucoups plus complexe... (la méthode par défaut se contente de comparer la valeur du caractère)

    Citation Envoyé par Djakisback
    Le constructeur TreeMap(Map m, Comparator c) n'existant pas je ne vois pas comment l'on peut faire.
    Citation Envoyé par Djakisback
    Bon j'ai simplement fait une copie par itération et ca fonctionne très bien.
    Je pense effectivement que de travailler sur un HashMap puis de la recopier dans une TreeMap est la meilleure solution dans ce cas...

    Tu peux également utiliser pour cela la méthode putAll() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Map map = new HashMap();
    // on remplit la Map
    ...
     
    // Puis on "copie" :
    SortedMap sortedMap = new TreeMap(Collator.getInstance());
    sortedMap.putAll(map);
    a++

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Merci pour ces précisions. Ah oui en effet c'est plus pratique avec putAll() ^^
    salut

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

Discussions similaires

  1. Menu dont les items sont des tables construites dans un UserControl
    Par cyrano_de_bergerac dans le forum ASP.NET
    Réponses: 6
    Dernier message: 23/03/2011, 12h44
  2. Tableau dont les éléments sont des tableaux
    Par tpdm dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 27/01/2010, 19h02
  3. arbre LinkTree dont les noeuds sont des liens
    Par caro_caro dans le forum Wicket
    Réponses: 5
    Dernier message: 05/06/2009, 01h32
  4. Réponses: 3
    Dernier message: 20/08/2007, 17h30
  5. Résultat exact division dont les membres sont des requêtes
    Par totoranky dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/08/2007, 14h51

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