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 valeur int


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut Trier une map sur valeur int
    Bonjour,
    Je tente de trier une map selon ses valeurs dans l'ordre décroissant.
    Ces valeurs sont des objets de types entier.
    j'ai repris le post :http://www.developpez.net/forums/showthread.php?t=57800dans ce post 'elitost' utilise un TreeSet, j'uitilise une hashmap et
    le probleme c'est que la HashMap n'implemente pas comparator...
    Merci pour vos suggestions
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    int est un type primitif, et non un objet, donc tu ne peux pas appeler de méthodes dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        static final Comparator ordreCpt = new Comparator() {
            public int compare(Object o1, Object o2){   
                return ((Compteur)o1).getValeur() - ((Compteur)o2).getValeur();
            }
        };

  3. #3
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Merci,
    j'ai pense avoir rectifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     return(new Integer(((Compteur)o1).getValeur())).compareTo(new Integer(((Compteur)o2).getValeur()));
            }
    Cependant un problème demeure quand a l'utilisation de comparator dans une hashmap, non?
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  4. #4
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Y a vraiement tout sur ce site :
    http://bruce-eckel.developpez.com/li...hap=10&page=11
    dans quelques heures je devrait y arriver
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  5. #5
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Ma HashMap se compose d'un couple
    cle objet membre
    valeur objet compteur (type integer)

    je viens d'adapter la solution proposé par djo.mo
    mais j'ai l'erreur :
    public class CompteurComparator implements Comparator n'est pas abstraite...
    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
     
     
    public class CompteurComparator implements Comparator{
        private Map membres;//pour garder une copie du Map que l'on souhaite traiter
     
        public CompteurComparator(Map membres){
        this.membres = membres; //stocker la copie pour qu'elle soit accessible dans compare()
        }
     
        public int compare(Membre m1, Membre m2){
            //Compteur
            Compteur cpt1 = (Compteur)membres.get(m1);
            Compteur cpt2 = (Compteur)membres.get(m2);
     
            if(cpt1.getValeur() < cpt1.getValeur())
              return -1;
            else if(cpt1.getValeur() > cpt2.getValeur())
              return 1;
            else return 0;
     
                }
    }
    Merci de votre aide
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  6. #6
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    compare(Object m1, Object m2)
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  7. #7
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Ma map n'est pas triée :
    mapEvaluateur:
    key objet membre
    valeur objet compteur

    Comparator :
    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
    public class CompteurComparator implements Comparator{
        private HashMap membres;//pour garder une copie du Map que l'on souhaite traiter
     
        public CompteurComparator(HashMap membres){
        this.membres = membres; //stocker la copie pour qu'elle soit accessible dans compare()
        }
     
        public int compare(Object m1, Object m2){
            //Compteur
            Compteur cpt1 = (Compteur)membres.get(m1);
            Compteur cpt2 = (Compteur)membres.get(m2);
     
     
            if(cpt1.getValeur() < cpt2.getValeur())
              return -1;
            else if(cpt1.getValeur() > cpt2.getValeur())
              return 1;
            else return 0;
                }
     
    }
    Affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       List cles = new ArrayList(mapEvaluateur.keySet());
                                  Collections.sort(cles, new CompteurComparator(mapEvaluateur)); 
                                  int j;
                                  j=0;
                                  Set keys = mapEvaluateur.keySet();
                                  Iterator it = keys.iterator();
                                   while(it.hasNext()){
                                   Membre membre = (Membre)it.next();
                                  Compteur cptOrdre = (Compteur)mapEvaluateur.get(membre);
                                  out.println(cptOrdre.getValeur() + "</br>");
                                  j++;
                                   }
    Merci de vos suggestions
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  8. #8
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour,
    Il faut utiliser la liste cles qui est triée pour parcourir la Map et non pas son keySet comme c'est clairement indiqué dans la FAQ

  9. #9
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Merci djo.mos, ça marche impec.
    Si j'ai bien compris la subtilité est ici :
    Il suffit alors de passer le Map au Comparator dans le constructeur pour que l'on puisse retrouver une personne via son identifiant.
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  10. #10
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Génial
    Et oui, le truc c'est de passer le Map au constructeur du Comparator, entre autres, mais aussi l'utilisation d'une liste séparée pour trier les clés du Map et pour la parcourir.

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

Discussions similaires

  1. Trier une Map sur les valeurs de façon décroissante
    Par ddams dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 27/12/2011, 18h33
  2. Réponses: 7
    Dernier message: 28/01/2010, 14h44
  3. [Access] Trier une table sur plusieurs critères
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/05/2006, 19h18
  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

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