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 un HasMap par ses valeurs.


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut trier un HasMap par ses valeurs.
    bonsoir à tous ,
    j'ai unHashMap <int, String> comme ci-dessous :
    1 Pierre
    2 Marcel
    3 Pierre
    4 Gorge
    etc ....
    Je souhaiterais trier selon les valeurs et pouvoir acceder ensuite a l'index int correspondant a la valeur .

    J'ai vu la FAQ ici : http://java.developpez.com/faq/java/...IONS_trier_map

    Mais je ne comprend pas tout .

    J'ai bien compris ce passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Long> cles = new ArrayList<Long>(personnes.keySet());
    Collections.sort(cles, new PersonneComparator(personnes));
    on trie les clef en fonctions des valeurs avec le comparateur .

    Par contre en ce qui concerne le comparateur , je ne vois pas comment ca fonctionne , le trie ce fait de facon ascendente ou descendente ?
    De plus comment l'adapter pour trier mes valeurs (qui sont des String et non pas des int) de manière ascendente par exemple .


    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
    public class PersonneComparator implements Comparator<Long>{
        private Map<Long, Personne> personnes;//pour garder une copie du Map que l'on souhaite traiter
        public PersonneComparator(Map<Long, Personne> personnes){
            this.personnes = personnes; //stocker la copie pour qu'elle soit accessible dans compare()
        }
     
        public int compare(Long id1, Long id2){
            //récupérer les personnes du Map par leur identifiant
            Personne p1 = personnes.get(id1);
            Personne p2 = personnes.get(id2);
     
            //comparer les deux clés en fonction de l'age des personnes qu'ils indexent.
            return p1.getAge() - p2.getAge();
        }
    }
    Merci de votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Par défaut
    La méthode importante d'un comparateur est http://java.sun.com/j2se/1.4.2/docs/...a.lang.Object)

    Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
    Si le résultat de la comparaison de A et B est une valeur négative (positive), alors A sera positionné avant (après) B dans la liste.

    Si tu tries deux chaines de caracteres, tu peux te contenter de renvoyer le résultat des méthodes de comparaison lexicographique de l'objet String.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class TestComparator implements Comparator<String>{
     
        public int compare(String a, String b){
            return a.compareTo(b);
        }
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    ok j'ai bien compris , alors j'ai ecris cela :

    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<Integer ,String> map = new HashMap<Integer ,String>();
    map.put(1,"Pierre");
    map.put(2,"Pierre");
    map.put(3,"George");
    map.put(4,"Alain");
    map.put(5,"Pierre");
    map.put(6,"Albert");
     
    List<Integer> cles = new ArrayList<Integer>(map.keySet());
    Collections.sort(cles, new stringComparator());
     
     
    for(int id : cles){
          out.println(map.get(id)+"<br>");
    }
     
    for (int i=0 ; i< cles.size() ; i++)
    {
    	out.println(cles.get(i)+"<br>");
    }
    et puis mon comparator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class stringComparator implements Comparator{
     
    	    public stringComparator(){
    	    }
     
    	    public int compare(String id1, String id2){
    	        return id2.compareTo(id1);
    	    }
    }
    et le problème , c'est que ca ne fonctionne pas , cela me retourne ca :

    Pierre
    Pierre
    George
    Alain
    Pierre
    Albert
    1
    2
    3
    4
    5
    6
    ou est le problème ?

  4. #4
    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 : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Le problème, c'est que tu tries les clés... pas les valeurs.

    Ce n'est pas le "keyset" de ta Map qu'il faut trier, mais les "values".
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    arf oui merci , effectivement je compare pas les bon elements , merci .
    ca fonctionne maintenant .

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

Discussions similaires

  1. trier une matrice par ses colonnes
    Par Alex999 dans le forum C#
    Réponses: 2
    Dernier message: 12/12/2011, 12h43
  2. MAJ dans une table conditionnée par la valeur d'un de ses champs
    Par NicolasTT dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 24/03/2011, 15h31
  3. [Collection] Trier une Hashmap par valeur
    Par aelmalki dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 16/07/2009, 18h08
  4. Réponses: 1
    Dernier message: 13/06/2007, 22h36
  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