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 :

Trier une hashmap


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 53
    Par défaut Trier une hashmap
    Bonjour,

    Je voudris trier une hashmap selon les valeurs par ordre décroissant.
    J'ai trouvé une fonction sur ce forum que j'ai essayé d'adapter mais je n'ai pa recu à l'adapter correctement !!

    Voici mon code:
    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
    21
    22
    23
    24
    25
    26
    27
     
        private void sortMap(Map aMap) {
            Map myMap = new HashMap();
            Set set = new TreeSet(
                new Comparator()
                {
                    public int compare(Object obj, Object obj1)
                    {
                        Integer val1 = (Integer) ((Map.Entry) obj).getValue();
                        Integer val2 = (Integer) ((Map.Entry) obj1).getValue();
                        if (val2.compareTo(val1)==0) return -1;
                        return val2.compareTo(val1);
                    }   
                }
            );
     
            set.addAll(aMap.entrySet());
     
            for(Iterator it = set.iterator(); it.hasNext() ;) {
                Map.Entry myMapEntry = (Map.Entry) it.next();
                System.out.println (  myMapEntry.getKey (  )  + " = " + myMapEntry.getValue (  )   ) ; 
                myMap.put( myMapEntry.getKey(), myMapEntry.getValue());
            }
     
            System.out.println("MyMap: "+myMap.values());
     
        }
    Mon probleme est que les deux lignes suivantes ne me donne pas le même résultat:

    System.out.println (myMapEntry.getKey()+"="+myMapEntry.getValue()) ;

    System.out.println("MyMap: "+myMap.values());

    En effet, la premiere ligne (dans la boucle for) me donne les résultats dans l'ordre décroissant comme je le désire, alors que la deuxieme me donne les résultats dans le sens inverse (en faite elle me donne le résultats toujours dans l'ordre croissant)

    Je ne comprend pas d'ou vient cette erreur. On dirait que la fonction "put" met les réultats toujours dans le même ordre.

    Il est également fortement possible que j'ai mal compris le code, en effet je ne suis pas familier avec les comparator.

    Pourriez-vous m'aider s'il vous plait.

    Merdi beaucoup pour votre aide.

  2. #2
    Membre confirmé
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 32
    Par défaut
    Modifie la méthode compare comme suit, ça doit marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
             public int compare(Object obj, Object obj1)
                    {
                        Integer val1 = (Integer) ((Map.Entry) obj).getValue();
                        Integer val2 = (Integer) ((Map.Entry) obj1).getValue();
                        if (val1  < val2 ) 
                             return -1;
                        else if (val1  > val2)
                             return +1 ; 
                        else
                             return 0;
                    }

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 53
    Par défaut
    Salut,

    J'ai changé comme tu m'as di mais j'ai toujours le même problème (J'ai inversé les inégalités pour obtenir en ordre décroissant) !!

    Donc le system.println dans la boucle for me donne bien les valeurs dans l'ordre décroissant alors que quand j'affiche ma hashmap apres la boucle, j'ai les valeurs en ordre croissant !!!

    Dans la javadoc, il y a marqué ca a propos des hashmap: "This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time" !! Ca voudrait dire que la hashmap trie comme elle veut ??

    Ou serait-ce un problème avec la fonction put ??

    Merci pour votre aide

  4. #4
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Bonjour,

    Tu as essayé de passer par une TreeMap ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Map sortMap(Map m) {
      TreeMap tm = new TreeMap(new Comparator() {
         // Je te laisse remplir le comparateur
      });
      tm.putAll(m);
      return tm;
    }
    Je n'ai pas testé le code ci-dessus. Donc sauf coquilles de ma part, ça marche

    Gronono

  5. #5
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Arf, nos posts ont du se croiser.

    Citation Envoyé par nonolerobot77 Voir le message
    Ca voudrait dire que la hashmap trie comme elle veut ??
    Oui la HashMap ne garantit pas l'ordre des éléments. En fait je crois (j'ai bien je crois) que les éléments sont triés par hashcode.

    Pour avoir une map trié, il faut utilisé TreeMap. cf mon post du dessus.

  6. #6
    Membre confirmé
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 32
    Par défaut
    voila un lien peut être ça t'aidera

Discussions similaires

  1. Trier une HashMap
    Par youza dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 20/10/2011, 19h24
  2. [Collection] Trier une Hashmap par valeur
    Par aelmalki dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/07/2009, 18h08
  3. trier une hashmap
    Par fadoua34090 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 26/10/2007, 01h16
  4. [débutant] cherche a copier une HashMap
    Par mathieublanc13 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/05/2004, 14h33
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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