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 :

[Débutant] Récupérer les valeurs et les clés d'une HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 87
    Points
    87
    Par défaut [Débutant] Récupérer les valeurs et les clés d'une HashMap
    Bonjour,
    j ai reussi a avoir la listes des key, mais j aimerai afficher les valeurs associees, voci mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    java.util.HashMap data = (java.util.HashMap) 
    if (data != null ) {
    for( java.util.Iterator  ii = data.keySet().iterator(); ii.hasNext();) {
    String key = (String)ii.next();
    dois je faire ceci pour recupere les valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String  value = (String) data.get(key);

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Parcourir une map en java, c'est rarement joli.

    La maniere la plus élégante que j'ai trouvé pour faire ça, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (HashMap.Entry<type1, type2> entry : tamap.entrySet())
    {
       entry.getKey();
       entry.getValue();
    }
    ça t'évite de tout recaster 1000 fois.
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 87
    Points
    87
    Par défaut
    euh trop complique pour moi, deja
    le < type1 etc...pour le < ca passe pas en java

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par Mobistar Voir le message
    euh trop complique pour moi, deja
    le < type1 etc...pour le < ca passe pas en java
    t'utilises quelle version de java ?

    Ce qu'il y a entre les <> ce sont les types de la map, qui est un generics, et qui doit donc etre paramétrée.

    type1 sera le type de la clé, et type2 le type de la valeur.

    Ici c'est <String, String>

    Si ça ne "passe pas" c'est que tu utilises une version de java trop vieille.
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 87
    Points
    87
    Par défaut
    oui j utilise une version trop vieille de java effectivement.

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par Mobistar Voir le message
    oui j utilise une version trop vieille de java effectivement.
    Oublie ma méthode alors :p
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 87
    Points
    87
    Par défaut
    mais ta methode etait instructive , mais est-ce que ma version pas geniale est correcte du moins?

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par Mobistar Voir le message
    mais ta methode etait instructive , mais est-ce que ma version pas geniale est correcte du moins?
    Oui, mais il faut absolument éviter de déclarer des variables à l'intérieur d'une boucle.

    Tu la déclare une fois pour toute en haut de ta fonction, et tu la réutilises.

    Sinon, il me semble qu'il n'y a pas de problème.
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 245
    Points : 87
    Points
    87
    Par défaut
    merci bien

  10. #10
    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
    Citation Envoyé par Mobistar Voir le message
    mais ta methode etait instructive , mais est-ce que ma version pas geniale est correcte du moins?
    Oui c'est correct.
    Mais si tu veux récupérer le nom et la valeur ne même temps tu peux utiliser un iterator sur le keySet() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	Iterator iterator = map.entrySet().iterator();
    	while (iterator.hasNext()) {
    		Map.Entry entry = (Map.Entry) iterator.next();
    		String key = (String) entry.getKey();
    		String value = (String) entry.getValue();
     
    		System.out.println(key + " = " + value);
    	}
    Citation Envoyé par Faiche Voir le message
    Oui, mais il faut absolument éviter de déclarer des variables à l'intérieur d'une boucle.

    Tu la déclare une fois pour toute en haut de ta fonction, et tu la réutilises.
    Au contraire : en déclarant les variables à l'intérieur de la boucle ton code est mieux organisé et tu limites la porté des variables temporaires...

    le compilateur sait très bien optimisé cela par la suite et le bytecode généré devrait être très proche voir identique.

    a++

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Y a-t-il moyen de créer une méthode générique qui permet d'afficher les HashMap qu'on lui passerait en paramètre ?

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    HashMap<String, type1> liste1 = new HashMap<String, type1>();
    HashMap<String, type2> liste2 = new HashMap<String, type2>();
    // ...
    afficheHashMap(liste1);
    afficheHashMap(liste2);
    j'aurais espéré un truc dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void afficheHashMap(HashMap<K,V> liste) {
       for (Entry<K, V> entry : liste.entrySet())
          System.out.println(entry.getValue());
    }
    mais forcément, ce n'est pas si simple

  12. #12
    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,

    Tout simplement :
    Citation Envoyé par number6six Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void afficheHashMap(HashMap<?,?> liste) {
       for (Entry<?,?> entry : liste.entrySet())
          System.out.println(entry.getValue());
    }
    Le "?" dans HashMap<?,?> signifie que tu ne connais pas le type exact, mis à part qu'il hérite d'Object (forcément puisque c'est le cas de tous les objets en Java).
    Tu pourrais également spécifier cela en déclarant le paramètre comme ceci : HashMap<? extends Object,? extends Object> mais c'est surtout pratique si tes clefs ou valeurs étendent d'un type de base plus spécifique que Object...


    a++

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    merci, je m'étais embrouillé avec les <K, V> fourni par l'IDE mais en fait, il fallait mettre des ?
    et ça fonctionne nickel

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 67
    Points : 63
    Points
    63
    Par défaut exemple
    voici un code assez simple trois classes 1 qui contient la hashmap aisni que les methodes de saisie et d'affichage.
    1 qui contient les étudiants et une les notes
    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
    import java.util.HashMap;
     
    public class ListeNote {
    	HashMap<Etudiant, Note> liste = new HashMap<Etudiant, Note>();
     
    	public void saisirMap(Etudiant e, Note n) {
    		liste.put(e, n);
    	}
     
    	public void affiche() {
    		for (HashMap.Entry<Etudiant, Note> entry : liste.entrySet())
    		{
    		   entry.getKey();
    		   entry.getValue();
    		}
    	}
     
    	@Override
    	public String toString() {
    		return "ListeNote [liste=" + liste + "]";
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Etudiant {
    private String nom;
     
    public Etudiant(String nom) {
    	super();
    	this.nom = nom;
    }
     
    @Override
    public String toString() {
    	return "Etudiant [nom=" + nom + "]";
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Note {
    private int note;
     
    public Note(int note) {
    	super();
    	this.note = note;
    }
     
    @Override
    public String toString() {
    	return "Note [note=" + note + "]";
    }
    }
    voici le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Main {
     
    	public static void main(String[] args) {
    		Note n1 = new Note(12);
    		Etudiant et = new Etudiant("omar");
    		ListeNote l1= new ListeNote();
    		l1.saisirMap(et, n1);
    	System.out.println(	l1);
     
    	}
     
    }

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Pas terrible, cet exemple.
    - Il ne fait qu'appeler HashMap.toString() sans montrer comment parcourir la Map.
    - Il donne le mauvais exemple d'utiliser comme clé une classe qui ne redéfinit pas hashCode() et equals(). Pas facile à utiliser en vrai. Il aurait mieux valu utiliser une classe Java genre String, Integer, Instant...
    - C'est un peu tiré par les cheveux, quand même. Genre la méthode affiche(), censée montrer comment on parcourt la Map, mais qui n'est pas appelée et qui de toute façon ne fait rien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/12/2007, 13h27
  2. Réponses: 4
    Dernier message: 03/08/2007, 14h09
  3. Gridview: Comment récupérer les valeurs des deux clés?
    Par Thomas_Laurent dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/02/2007, 14h54
  4. Récupérer les valeur d'un énuméré dans une string
    Par Oliv_75 dans le forum SL & STL
    Réponses: 5
    Dernier message: 28/09/2005, 00h55

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