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 :

[Collection] Trier une Hashmap par valeur


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut [Collection] Trier une Hashmap par valeur
    Bonjour,

    Je reviens vers vous pour vous demander de l'aide concernant le trie d'une HashMap par valeur,

    J'ai vu pas mal de topic et de FAQ concernant ce point, mais mon problème c'est que je travail sur un projet qui utilise JDK1.4, et l'utilisation de classe comme LinkedHashMap n'est pas possible.

    Et mon problème plus exactement : je veux trier un HashMap par valeur et remettre le tous dans un objet HashMap par la suite

    Je vous remercie pour votre retour.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Un HashMap n'est jamais trié.
    Si tu veux conserver le tri, tu dois utiliser une autre structure de donnée. Un ArrayList par exemple.

  3. #3
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Bonjour,
    une structure grosso modo identique aux HashMap mais triée est la TreeMap, qui va trier selon l'ordre de tri naturel des clés (si c'est une String, par ordre alphabétique par exemple)

    edit: la TreeMap est dispo depuis la version 1.2 donc tu devrais pouvoir l'utiliser
    edit 2: ah oui j'avais pas vu que tu voulais trier par valeur et non par clé...
    alors ce que tu peux faire, c'est récupérer tes objets triés ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TreeSet ts = new TreeSet(taHashMap.values());
    Mais tu perdras la notion de clé de ta hashMap. Ou alors tu recopie tes clés dans une ArrayList à part, que tu trieras comme tu veux.

  4. #4
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Moi mon souci c'est lors de put sur une HashMap, l'ordre de put n'est pas respecter, voici un exemple qui montre la différence entre le put sur une HashMap et TreeMap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    		Map _map = new TreeMap();
    		HashMap _map2 = new HashMap();
     
    		_map.put("A", new Long(0));
    		_map.put("F", new Long(1));
    		_map.put("G", new Long(2));
    		_map.put("R", new Long(3));
    		_map.put("T", new Long(4));
     
    		_map2.put("A", new Long(0));
    		_map2.put("F", new Long(1));
    		_map2.put("G", new Long(2));
    		_map2.put("R", new Long(3));
    		_map2.put("T", new Long(4));
     
    		//_map2.putAll(_map);
     
    		System.out.println(_map);
    		System.out.println(_map2);
    Le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {A=0, F=1, G=2, R=3, T=4}
    {R=3, A=0, F=1, T=4, G=2}
    Est ce que vous avez une idée de la manier par laquelle je doit procéder pour conserver l'ordre des put sur une HashMap, parce que malheureusement je ne peut pas modifier le type de l'attribut de cet objet de HashMap en TreeMap ou ArrayList par exemple.

  5. #5
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Effectivement Jidefix c'est ce que j'ai remarquer,

    par contre je ne peux pas modifier le type de l'attribut, je doit obligatoirement passer par une HashMap !

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par aelmalki Voir le message
    par contre je ne peux pas modifier le type de l'attribut, je doit obligatoirement passer par une HashMap !
    Une dernière fois : le tri n'est pas conservé dans une HashMap.
    Puisque tu dois passer obligatoirement pas une HashMap, alors ton problème restera sans solution.

    Par contre, si tu peux dériver une classe de HashMap, alors tu pourras y gérer le tri que tu souhaites.

  7. #7
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Une dernière fois : le tri n'est pas conservé dans une HashMap.
    Puisque tu dois passer obligatoirement pas une HashMap, alors ton problème restera sans solution.
    Merci.

  8. #8
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par aelmalki Voir le message
    Moi mon souci c'est lors de put sur une HashMap, l'ordre de put n'est pas respecter
    Dans ce cas, ce qu'il te faut, c'est une LinkedHashMap : il s'agit d'une Map (permettant de récupérer les objets par leur clé avec la méthode "get"), mais qui conserve l'ordre d'insertion.

    Ainsi, lorsque tu itères sur les objets d'une LinkedHashMap, ils te sont renvoyés dans leur ordre d'insertion (comme pour une liste).

    Au passage, la classe LinkedHashMap dérivant de HashMap, rien ne t'empêche de conserver le type HashMap, en écrivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HashMap maMap = new LinkedHashMap();
    Et si tu peux, je dirais même mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map maMap = new LinkedHashMap();
    Dans les deux cas, tu auras le comportement souhaité en itérant sur tes objets.

  9. #9
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Merci pour votre retour,

    Je ne peux pas utiliser la classe LinkedHashMap parce que le projet utilise JDK1.4.

  10. #10
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Euh... soit dit en passant LinkedHashMap ça existe justement depuis la 1.4...

  11. #11
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Pardon mes amis, j'utilise WSAD 5.1 et par défaut il utilise JDK1.3

    De toute façon je pense que ce n'est pas possible de trier cette HashMap parce que même ci c'est le cas, lorsque je vais setter l'objet à nouveau, la HashMap fpera de nouveau sa propre logique de l'ordre.

    Par contre LinkedHashMap est une bonne solution.

    Merci pour vos explications.

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

Discussions similaires

  1. [AC-2007] Trier une liste de valeur par odre alphabétique
    Par Samy-DT dans le forum IHM
    Réponses: 3
    Dernier message: 06/05/2014, 01h11
  2. Réponses: 1
    Dernier message: 13/06/2007, 22h36
  3. Trier une colonne par date
    Par foobar42 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/07/2006, 17h46
  4. Trier une table avec valeur de differentes unités
    Par Sydaze dans le forum Bases de données
    Réponses: 8
    Dernier message: 01/06/2005, 11h43
  5. [C#] Trier une Hashtable par les valeurs
    Par Joad dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/04/2005, 16h29

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