Afficher un hashmap
Résolu
charline159
Messages postés
208
Date d'inscription
Statut
Membre
Dernière intervention
-
charline159 Messages postés 208 Date d'inscription Statut Membre Dernière intervention -
charline159 Messages postés 208 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Afficher hashmap java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
3 réponses
Bonjour,
Il faut surcharger la méthode toString() dans la classe Key, comme c'est fait dans la classe Mot.
Il faut surcharger la méthode toString() dans la classe Key, comme c'est fait dans la classe Mot.
charline159
Messages postés
208
Date d'inscription
Statut
Membre
Dernière intervention
1
effectivement, ça marche, merci !
Par contre, j'aimerais bien afficher également la clef à partir d'une valeur, avec
mais j'ai un
j'ai essayé avec
qu'est-ce que je pourrais essayer de plus?
hm.hashmap.get(mot)
mais j'ai un
nullen guise de résultat (sachant que hm est un objet qui n'a pour attribut qu'un HashMap).
j'ai essayé avec
hm.hashmap.get(bonjour).toString()mais ça ne marche pas.
qu'est-ce que je pourrais essayer de plus?
"afficher également la clef à partir d'une valeur"
Une Map garantie que la clé est unique, mais on peut avoir plusieurs fois la même valeur. Donc une recherche par valeur peut renvoyer plusieurs résultats.
Par exemple tu peux faire map.put(k1, v) et map.put(k2, v). Dans ce cas une recherche de la valeur v devrait te renvoyer k1 et k2.
Une telle recherche n'est pas prévue pour les Map, tu peux considérer l'EntrySet comme une liste et faire la recherche à la main, mais les performances ne seront pas bonnes.
Éventuellement, si dans ton cas tu es sûr que chaque valeur sera associée à une seule clé, tu peux maintenir une deuxième Map inversée.
C'est à dire avoir une Map<K,V> valueByKey, et une Map<V,K> keyByValue, et à chaque ajout faire valueByKey.put(k,v) et keyByValue.put(v,k), afin de pouvoir faire la recherche dans un sens ou dans un autre.
Remarque : de même que tu avais oublié la méthode toString, assures toi de ne pas oublier de surcharger les méthodes hashCode et equals, sinon les Map ne feront pas ce que tu penses.
Une Map garantie que la clé est unique, mais on peut avoir plusieurs fois la même valeur. Donc une recherche par valeur peut renvoyer plusieurs résultats.
Par exemple tu peux faire map.put(k1, v) et map.put(k2, v). Dans ce cas une recherche de la valeur v devrait te renvoyer k1 et k2.
Une telle recherche n'est pas prévue pour les Map, tu peux considérer l'EntrySet comme une liste et faire la recherche à la main, mais les performances ne seront pas bonnes.
Éventuellement, si dans ton cas tu es sûr que chaque valeur sera associée à une seule clé, tu peux maintenir une deuxième Map inversée.
C'est à dire avoir une Map<K,V> valueByKey, et une Map<V,K> keyByValue, et à chaque ajout faire valueByKey.put(k,v) et keyByValue.put(v,k), afin de pouvoir faire la recherche dans un sens ou dans un autre.
Remarque : de même que tu avais oublié la méthode toString, assures toi de ne pas oublier de surcharger les méthodes hashCode et equals, sinon les Map ne feront pas ce que tu penses.
je sais d'avance qu'il y aura plusieurs clefs pour une même valeur, donc je pense que je vais laisser tomber l'idée du coup. Je pensais que c'était utile d'implémenter la méthode, au cas où... mais apparemment pas en fin de compte. Merci encore pour ton aide.
Par contre, il y a un truc que je ne comprends pas, c'est ceci:
j'ai deux résultats différents, alors que ça devrait me retourner true dans les 2 cas:
voici la méthode utilisée en question:
sachant que ma classe ne contient qu'un seul attribut:
Par contre, il y a un truc que je ne comprends pas, c'est ceci:
System.out.println("hm constains value \"bonjour\"? " + hm.containsValue(bonjour)); System.out.println("hm constains value \"bonjour\"? " + hm.hashmap.containsValue(bonjour));
j'ai deux résultats différents, alors que ça devrait me retourner true dans les 2 cas:
hm constains value "bonjour"? false hm constains value "bonjour"? true
voici la méthode utilisée en question:
public boolean containsValue(Mot mot){ return this.hashmap.containsValue(mot.getMot().toString()); }
sachant que ma classe ne contient qu'un seul attribut:
public HashMap<Key, Mot> hashmap;
hm.containsValue(bonjour)est équivalent à
hm.hashmap.containsValue(mot.getMot().toString()), c'est à dire que tu fais une recherche d'un String dans une map dont les valeurs sont des Mot.
Comme les deux objets sont de types différents ils ne peuvent pas être égaux.
Ceci aurait été plus juste :
public boolean containsValue(Mot mot) { return hashmap.containsValue(mot); }
this est implicite, si tu ne le mets pas il y sera par défaut.
Il n'y a que dans trois cas où this est vraiment utile :
Il n'y a que dans trois cas où this est vraiment utile :
- lorsque tu as une variable de même nom que l'attribut de classe, typiquement dans les constructeurs : this.toto = toto;
- lorsque l'objet courant doit être manipulé, que ce soit directement (this == toto) ou en paramètre d'une méthode : toto(this);
- lorsqu'un constructeur appelle un autre constructeur de la même classe : this(toto)
d'accord, merci pour ta réponse.
Au passage, j'essaie d'afficher les éléments d'une arraylist contenue dans
résultat: quand je fais un
Est-ce que j'ai fait une erreur avec mes méthodes ?
Au passage, j'essaie d'afficher les éléments d'une arraylist contenue dans
HashMap<Key, ArrayList<Mot>>avec ces méthodes.
// ajout d'un mot via ArrayList et sa clef correspondante public void put(Key key, Mot mot){ ArrayList<Mot> anagramme = new ArrayList(); anagramme.add(mot); this.hashmap.put(key,anagramme); } // retourne le ou les élément(s) à partir d'une clef public String get(Key key){ return this.hashmap.get(key).toString(); }
résultat: quand je fais un
hashmap.get(key), je n'ai que le premier élément de l'arrayList.
Est-ce que j'ai fait une erreur avec mes méthodes ?
Le problème c'est que à chaque fois que tu fais un put tu crées une nouvelle liste, alors qu'il faudrait faire des add sur la liste qui existe déjà (quand elle existe).
public void put(Key key, Mot mot) { ArrayList<Mot> anagramme = hashmap.get(Key); if (anagramme == null) { anagramme = new ArrayList<>(); hashmap.put(key, anagramme); } anagramme.add(mot); } public ArrayList<Mot> get(Key key) { return hashmap.get(key); }