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 :

[HashMap] Tri sur plusieurs valeurs


Sujet :

Collection et Stream Java

  1. #1
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut [HashMap] Tri sur plusieurs valeurs
    Bonjour,

    Actuellement je stock dans ma hashMap plusieurs Bean.
    J'affiche ces bean par du jstl dans un tableau Html.
    Cependant je voudrais pouvoir les afficher triés.

    Je ne veux pas simplement trier les clés mais aussi toutes les colonnes (attributs de mon Bean).
    D'abord trie sur la colonne A puis ensuite la B etc

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    A 1  ..
    A 2  ..
    A 3  ..
    B 1  ..
    B 2  ..
    Si je ne suis pas très clair n'hésitez pas à me demander des informations.

    Merci pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Une HashMap ne peux pas trier, mais TreeMap le peut.
    Il te faudra simplement lui donner un comparateur en parametre du constructeur. C'est ce comparateur qui fera le test:

    Obj1.Col1 < Obj2.Col1 --> <
    Obj1.Col1 > Obj2.Col1 ---> >
    Si Obj1.Col1=Obj2.Col1 alors
    Obj1.Col2 < Obj2.Col2 ---> <
    Obj1.Col2 > Obj2.Col2 ---> >
    Obj1.Col2 = Obj2.Col2 ---> =

  3. #3
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Si tu as la possibilité d'avoir les données triées dans l'ordre que tu souhaites avant de les inclure dans la HashMap, tu peux utiliser une LinkedHashMap qui conserve l'ordre d'insertion.

  4. #4
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut
    Je ne peux pas utiliser le LinkedHashMap car l'ordre d'insertion ne correspond pas à l'ordre de trie.

    J'ai créé la procédure:
    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
     
    public class ZoneInfluenceBean implements Comparable {
    ...
     
    public int compareTo(Object other) { 
    if (this.getType().compareTo(((ZoneInfluenceBean) other).getType()) < 0) {
          return 1;
    }
       else if  (this.getType().compareTo(((ZoneInfluenceBean) other).getType()) > 0) {
    	return -1;
    }
      else {
    	if (this.getLocalisant().compareTo(((ZoneInfluenceBean) other).getLocalisant()) < 0) {
    			 return 1;
    		 }
                   else if  (this.getLocalisant().compareTo(((ZoneInfluenceBean) other).getLocalisant()) > 0) {
    			 return -1;
    		 }
    		 else
    			 {
    			 if (this.getDescription().compareTo(((ZoneInfluenceBean) other).getDescription()) < 0) {
    					 return 1;
    				 }
    				 else if (this.getDescription().compareTo(((ZoneInfluenceBean) other).getDescription()) > 0) {
    					 return -1;
    				 }
    				 else return 0;
    			 }
    		 }
     
    	   }
    Mais cela ne fait rien.

    Voici mon validate pour ajouter mon bean dans ma hashMap en session :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ZoneInfluenceBean zoneInfluenceBean = new ZoneInfluenceBean(
    description, localisant, localisantDesc, type, typeDesc);
     
    Map infHmap = new HashMap();
    infHmap = (HashMap) request.getSession().getAttribute("InfHmap");
     
    // Rajoute le record dans le Bean en session
    infHmap.put(localisant, zoneInfluenceBean);
     
    //puis on construit la TreeMap. 
    infHmap = new TreeMap(infHmap);
    J'ai mis un point d'arret sur compareTo et je n'y rentre jamais.

    J'ai du rater un truc.

    Merci

  5. #5
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Moi j''aurai fait un comparator plutot que qu'implementer comparable dans mon bean.

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quelques remarques :
    • Les Map sont triées par rapport à la clef et non pas la valeur...
    • Pourquoi répéter plusieurs fois le cast en (ZoneInfluenceBean) dans ta méthode compareTo ? Ce serait plus lisible d'utiliser une variable locale...
    • Ton imbrication des else/if n'est pas très lisible non plus


    Sinon pourquoi utilises-tu une Map ?
    Il semblerait que tu veux représenter une structure tabulaire, donc une List serait plus approprié... Et il te suffit ensuite d'utiliser la méthode Collections.sort() pour la trier selon tes besoins...

    a++

  7. #7
    Membre actif
    Inscrit en
    Mai 2004
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 297
    Points : 207
    Points
    207
    Par défaut
    Tes remarques sont très instructives.
    Ma réponse est simple c'est que je suis nouveau dans cet univers, je ne maitrise pas grand chose
    Tu as bien raison j'ai essayé de passer par une list et la tout marche bien.
    Je n'ai plus qu'a réecrire mon code pour être tout beau.

    Merci beaucoup pour votre aide

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

Discussions similaires

  1. [SQL SERVER ] Tri sur plusieurs champs
    Par fantomchris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/07/2006, 17h59
  2. Comment faire un Tri sur plusieurs champs
    Par guile153 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2006, 12h52
  3. Tri sur plusieurs colonnes
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 04/03/2006, 15h28
  4. [Collection] Tris sur plusieurs champs
    Par partyboy dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 12/07/2005, 16h56
  5. Condition IF sur plusieurs valeurs
    Par davelop dans le forum ASP
    Réponses: 5
    Dernier message: 10/06/2005, 11h10

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