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 :

Pb d'accès au contenu d'une HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut Pb d'accès au contenu d'une HashMap
    Voila, je programme un mini dictionnaire, où les mots et les définitions sont stockés dans une hashmap. Les mots correspondent (sous forme de String) aux keys et les définitions (aussi en String) aux values.
    Pour afficher le contenu de ma HashMap, j'utilise une méthode affichage(), qui parcourt la hashmap via la méthode entrySet(), que je parcours avec un iterator.

    Et voila l'affichage qui sort :
    Le mot Manger qui a pour def dico.Definition@1372a1a a été ajouté au dico
    Le mot Boire qui a pour def dico.Definition@ad3ba4 a été ajouté au dico
    Le mot Deguster qui a pour def dico.Definition@1372a1a a été ajouté au dico

    Les Mots contenu dans le dictionnaire sont :
    Deguster=dico.Definition@1372a1a
    Manger=dico.Definition@1372a1a
    Boire=dico.Definition@ad3ba4
    Que sont ces adresses? pourquoi n'ai je pas accès aux définitions? est ce un problème de cast? merci à ceux qui tenteront de m'aider.



    Voici le code de la classe :
    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
    36
    37
     
    public class Dictionnaire{
    	/*
    	 * Champs de classe
    	 */
    	protected HashMap dico;
     
    	/*
    	 * Constructeur par défaut
    	 */
    	public Dictionnaire(){
    		dico=new HashMap();
    	}
     
    	public Dictionnaire ajouterMot(Mot m, Definition def){
    		dico.put(m.getMot(),def);
    		System.out.println("Le mot "+m.getMot()+" qui a pour def "+def+" a été ajouté au dico");
    		return this;
    	}
     
    	public boolean contientMot(Mot m){
    		return dico.containsKey(m.getMot());
    	}
     
    	public void affichage(){
    		Set contenudico=dico.entrySet();
    		Iterator iter=contenudico.iterator();
    		System.out.println("Les Mots contenu dans le dictionnaire sont :");
    		while(iter.hasNext()) {
        			System.out.println(iter.next());
        	        }
     
     
            }
     
     
    }

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonjour,

    c'est ce qui s'affiche lorsque la méthode toString() n'a pas été redéfinies, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClass().getName() + '@' + Integer.toHexString(hashCode())
    Cf. la javadoc

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    Ok. Le problème est en partie résolu. J'ai effectivement redéfini toString() dans ma classe définition, et j'ai l'affichage de la définition:

    Les Mots contenu dans le dictionnaire sont :
    Deguster=Absorber un aliment, de la nourriture
    Manger=Absorber un aliment, de la nourriture
    Boire=Avaler un liquide pour se désaltérer
    Merci !!

    Par contre, l'ordre est inversé par rapport à l'ordre d'ajout des éléments. Comment faire pour rétablir cet ordre?

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Utiliser une LinkedHashMap ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    Je peux pas utiliser la LinkedHashMap, parce que le cahier des charges de ce projet stipule l'emploi d'une HashMap.

    j'ai essayé des modifications, changer l'ordre des ajouts des mots dans le dico, où modifier les définitions, mais l'ordre d'affichage ne change pas.

    Je ne comprend pas, parce que l'ordre d'affichage n'est ni celui d'ajout, ni un tri alphabétique des mots, ni un tri alphabétique des définitions, bien que pour ces deux derniers, je ne vois pas comment ce tri pourrait intervenir vu qu'il n'est pas programmé...

  6. #6
    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
    Il n'y a pas d'ordre spécifique sur les entrées contenues dans une HashMap. Tu n'as d'autre choix que d'utiliser une LinkedHashMap ou une TreeMap si tu veux imposer toi-même l'ordre d'itération.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Points : 139
    Points
    139
    Par défaut
    Bon, ça marche, le problème est corrigé avec une LinkedHashmap. Merci.

    Edit : et si maintenant, je souhaite modifier l'ordre du contenu de ma LinkedHashMap, indépendemment de l'ordre d'insertion? si j'ajoutes mes définitions associées au mot dans un ordre hasardeux, et que je veux trier les mots (et donc les définitions en même temps), sachant que les mots servent de clé à la hashmap?

  8. #8
    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
    Map dico = new TreeMap();
    L'ordre naturel des clés sera appliqué, et comme tes clés sont des String, l'itérateur renverra les mots par ordre alphabétique.

  9. #9
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Désolé pour toi mais il n'y a pas d'ordre dans une hashMap.

    SI le projet stipule que tu dois utiliser une hashMap et garder l'ordre alors il va falloir changer de technique.
    Utiliser un entier pour l'ordre. Et mettre dans ta HashMap un objet de type aliment qu'il faut que tu definisses. Avec tous les attributs dont tu as besoin.

    HashMap h = new HashMap();
    h.put(entier(converti en string), aliment);

    Ainsi lorsque tu parcours :

    for (int i=0;i<h.size();i++){
    Aliment a =(Aliment)h.get(i);
    a.toString();
    }

    Bonne chance

  10. #10
    Membre régulier Avatar de java_fun
    Inscrit en
    Novembre 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 117
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    un petit progarmme

    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 TestCode {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
     
    	 try {
    		 	HashMap map = new HashMap();
    		 	map.put("cle3","valeur3");
    		 	map.put("cle2","valeur2");
    		 	map.put("cle1","valeur1");
    		 	TreeMap map_tree = new TreeMap(map);
    		 	// on parcours tous les keys 
    		 	Iterator it = map_tree.keySet().iterator(); 
    		 	while(it.hasNext()){
    		 		String cle =it.next().toString();
    		 		System.out.println("key :>"+cle+"-- value:>"+map_tree.get(cle));
    		 	}
     
     
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
     
     
    	}
     
    }
    c donne ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    key :>cle1-- value:>valeur1
    key :>cle2-- value:>valeur2
    key :>cle3-- value:>valeur3

Discussions similaires

  1. Accés au contenu d'une balise span dans un tableau
    Par matthias.21 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 19/11/2010, 18h53
  2. Réponses: 5
    Dernier message: 22/06/2010, 09h53
  3. Accès au contenu d'une cellule
    Par Tygrou dans le forum VBA Project
    Réponses: 2
    Dernier message: 28/11/2008, 12h21
  4. Probleme d'accès au contenu d'une application web
    Par masterboy01 dans le forum IIS
    Réponses: 6
    Dernier message: 22/09/2008, 20h51
  5. Acces au contenu d'une iframe
    Par Devether dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/11/2007, 08h44

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