Afficher un hashmap
Résolu/Fermé
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
-
23 févr. 2021 à 16:51
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 4 mars 2021 à 16:30
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 4 mars 2021 à 16:30
A voir également:
- Afficher hashmap java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Télécharger jeux java gameloft gratuit - Forum Mobile
- Java décompiler - Télécharger - Langages
3 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
Modifié le 23 févr. 2021 à 17:06
Modifié le 23 févr. 2021 à 17:06
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
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
Modifié le 23 févr. 2021 à 19:02
Modifié le 23 févr. 2021 à 19:02
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?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
23 févr. 2021 à 21:23
23 févr. 2021 à 21:23
"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.
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
Modifié le 24 févr. 2021 à 00:04
Modifié le 24 févr. 2021 à 00:04
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;
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
24 févr. 2021 à 13:08
24 févr. 2021 à 13:08
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); }
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
>
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
24 févr. 2021 à 22:44
24 févr. 2021 à 22:44
effectivement, ça marche, merci
Par contre, pourquoi supprimer le this ? Je pensais que c'était absolument nécessaire de le mettre pour faire allusion à l'objet sur lequel on appelle la fonction.
Par contre, pourquoi supprimer le this ? Je pensais que c'était absolument nécessaire de le mettre pour faire allusion à l'objet sur lequel on appelle la fonction.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
>
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
Modifié le 25 févr. 2021 à 08:16
Modifié le 25 févr. 2021 à 08:16
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)
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
>
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
25 févr. 2021 à 14:52
25 févr. 2021 à 14:52
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 ?
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
>
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
25 févr. 2021 à 21:05
25 févr. 2021 à 21:05
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); }
23 févr. 2021 à 18:27