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 Map sur les valeurs de façon décroissante


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ddams
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Par défaut Trier une Map sur les valeurs de façon décroissante
    Bonjour,

    J'ai besoin de trier une map sur les valeurs de façon décroissante.
    La clé est un String.
    La valeur est un Integer.

    Comment procéder ?

    merci d'avance.

  2. #2
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    En implémentant une classe Comparator comme ceci :

    A adapter bien sûr :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    public class CollectionComparator {
      static final Comparator ORDRE_DATE = new Comparator() {
        public int compare(Object o1, Object o2){
          if(!(o1 instanceof Video))
            throw new ClassCastException();
          return (new Integer(((Video)o1).obtenirAnnee())).compareTo(
                            new Integer(((Video)o2).obtenirAnnee()));
        }
      };
      static final Comparator ORDRE_REALISATEUR = new Comparator() {
        public int compare(Object o1, Object o2){
          if(!(o1 instanceof Video))
            throw new ClassCastException();
          return (((Video)o1).obtenirRealisateur()).compareTo(
                            ((Video)o2).obtenirRealisateur());
        }
      };
      public static void main(String[] args) {
        TreeSet t = new TreeSet();
        t.add(new Video("Le jour le plus long", "Ken Annakin", 1962));
        t.add(new Video("Un pont trop loin", "Richard Attenborough", 1977));
        t.add(new Video("Platoon", "Oliver Stone", 1986));
        t.add(new Video("Full metal jacket", "Stanley Kubrik", 1987));
        t.add(new Video("La ligne rouge", "Terrence Malick", 1998));
        t.add(new Video("The patriot", "Roland Emmerich", 2000));
        System.out.println("Tri par titre :\n" + t);    
        TreeSet tr = new TreeSet(ORDRE_REALISATEUR);
        tr.addAll(t);
        System.out.println("\nTri par réalisateur :\n" + tr);
        TreeSet ta = new TreeSet(ORDRE_DATE);
        ta.addAll(t);
        System.out.println("\nTri par année :\n" + ta);
     
      }
    }
    Bon courage

  3. #3
    Membre confirmé Avatar de ddams
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Par défaut
    merci pour ta réponse elitost,

    Je test ça ce soir.

  4. #4
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    A noter que la solution que je te donne est à adapter.

  5. #5
    Membre confirmé Avatar de ddams
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2002
    Messages : 147
    Par défaut
    Merci elitost,

    Ton code m'a bien aidé.


    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
     
    private static Map sortMap(Map aMap) {
        Map myMap = new HashMap();
        TreeSet 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();
                    return val1.compareTo(val2);
            }	
        });
     
       set.addAll(aMap.entrySet());
     
        for(Iterator it = set.iterator(); it.hasNext() ;) {
            Map.Entry myMapEntry = (Map.Entry) it.next();
            myMap.put(myMapEntry.getKey(), myMapEntry.getValue());
        }
     
        return myMap; 
    }

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

    J'ai essayé de reprendre votre code car je voudrais trier une Map de façon croissante mais j'ai un petit soucis !!

    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 me donne les résultats dans l'ordre 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 dé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.

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Par défaut
    Bonjour,

    Moi aussi j'ai essayé le code et ça marche pas est ce que vous pouvez m'aider.
    En fait je pense que ça marche que sur le key.


    Merci de votre aide.

  8. #8
    Invité de passage
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1
    Par défaut Et si on a des valeur double ??
    Bonjour,

    J'ai le même problème. J'ai réussi à en résoudre une partie mon problème c'est que dans mon HashMap peux posseder des clés différentes mais les même valeurs du coups votre méthode ne marche plus. Quelqu'un a une idée ??

    Voila 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
    28
    29
    30
    31
    32
    import java.util.*;
    import java.lang.*;
     
    public class test {
     
        public static void main(String[] args) {
     
            Map< String, Integer> tm = new HashMap< String, Integer>();
            tm.put("A", new Integer(3));
            tm.put("B", new Integer(1));
            tm.put("C", new Integer(3));
            tm.put("D", new Integer(5));
            Map myMap = new HashMap();
            TreeSet 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();
                        return val1.compareTo(val2);
                }	
            });
     
           set.addAll(tm.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());
           }
     
        }
     
    }
    Résultat :

    B 1
    A 3
    D 5


    ??

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Dans ce cas il faut insérer les éléments dans une List au lieu d'un Set.

    Et comme une List ne se trie pas toute seule, il faut la faire trier en appelant Collections.sort() en lui passant la List à trier et le Comparator à utiliser.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre Expert
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 985
    Par défaut
    C'est bien si ça fonctionne alors.

    Bon courage

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

Discussions similaires

  1. Filtrer une liste sur les valeurs d'une colonne
    Par julien.63 dans le forum SharePoint
    Réponses: 3
    Dernier message: 13/02/2009, 09h43
  2. Trier une map sur valeur int
    Par totoche dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 09/05/2008, 12h54
  3. trier une hashtable selon les valeurs
    Par Raylemon dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 20/06/2007, 12h44
  4. [C#] Trier une Hashtable par les valeurs
    Par Joad dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/04/2005, 17h29

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