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 :

Itérer sur une hashmap et récupérer les clés


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Par défaut Itérer sur une hashmap et récupérer les clés
    Bonjour , voici mon code.
    J'aimerais récupérer tous les articles de type Article de la variable articles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HashMap<Article,String> articles = new HashMap<Article,String>();
                          //Ajout d'articles dans articles
     
    			Iterator it = (Iterator)this.articles.keySet().iterator();
    			while(it.hasNext()){		
    	                   Article at = ....... ;  // A COMPLETER
                               Integer it = ....... ;  //A COMPLETER
                               articlestemp.put(at, it)
    			}

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    Moi j'aimerai bien une bonne bière !

    http://java.developpez.com/faq/java/..._parcourir_map

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    Euh ....

    Article at = (Article)it.next();

    Par contre je ne sais pas ce que tu veux mettre dans ta variable de type Integer. En plus cette variable porte le même nom que ton itérator donc ca risque de poser problème !

  4. #4
    Membre éclairé
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Par défaut
    C'est correct à la compilation mais ne marche pas à l'execution :

    Je pense que le fait que je spécifie <Article,Integer> M'empeche de faire un Iterateur correct dessus.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	HashMap<Article,Integer> articlestemp = new HashMap<Article,Integer>();
    		    Set set= articles.keySet () ; 
    		    Iterator iter = (Iterator)set.iterator () ; 
     
    			while(iter.hasNext()){
    				Object o = iter.next();
    				Article at = (Article)o;
    				if(!at.equals(a)){
    					Integer itt = (Integer)articles.get(a);
    					articlestemp.put(a,itt);
    				}
    			}
    me sort un

    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
    javax.servlet.ServletException: java.util.HashMap$KeyIterator
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    java.lang.ClassCastException: java.util.HashMap$KeyIterator
    	mywebapp.classes.Panier.delArticle(Panier.java:28)
    	mywebapp.action.DelArticleAction.execute(DelArticleAction.java:30)
    	org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
    	org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

  5. #5
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 27
    Par défaut
    Ton code ne génère pas des erreurs de compil ?

    La variable articles est définie où ? Et la variable a ?

  6. #6
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Ton itérateur n'est pas bon: il faut itérer sur la collection de couples (clef + valeur) - donc sur le type Map.Entry<Article, String> - et pas sur la collection des clefs seulement.

    La fonction qui va bien ? HashMap::entrySet():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    HashMap<Article,String> articles = new HashMap<Article,String>();
    // ajoute de tes articles.
     
    Iterator<Map.Entry<Article, String>> it = articles .entrySet().iterator()
    while (it.hasNext()) {
        Map.Entry<Article, Integer> entry = it.next();
        Article a = entry.getKey();
        String s = entry.getValue();
        System.out.println("map["+a+"] = "+s);
    }
    ... ou l'écriture (bien plus légère) style Java 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HashMap<Article,String> articles = new HashMap<Article,String>();
    // ajoute de tes articles.
    for (Map.Entry<Article, String> entry : articles .entrySet()) {
        Article a = entry.getKey();
        String s = entry.getValue();
        System.out.println("map["+a+"] = "+s);
    }
    ... mais tout cela était parfaitement expliqué dans la FAQ dont le lien a été donné ci-dessus

  7. #7
    Membre éclairé
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Par défaut
    Tout ce code fait partie d'une méthode d'une classe qui contient articles en atttribut et a en paramètre de la méthode.

    J'avais fait une erreur d'import pour l'objet Iterator d'où le besoin de caster. Mais en fait mon iterator était correct.

    J'ai décidé de passer ma hashmap en <String,Integer> , c'était plus simple ici surtout pour utiliser la méthode containskey .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Map<Article,Integer> articles = new HashMap<Article,Integer>();
    a1 = new Article("XXX","Maillot");
    a2 = new Article("XXX","Maillot"); //Objet identique à a1.
    articles.put(a1,new Integer(1));
    if(articles.containskey(a2)) => retourne false alors qu'elle contient le même objet.
    Certes, ce n'est pas la même référence! Comment faire dans ce cas pour que containskey retourne true? avec deux articles ayant la meme reference et le même libellé.

  8. #8
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par cotede2 Voir le message
    Certes, ce n'est pas la même référence! Comment faire dans ce cas pour que containskey retourne true? avec deux articles ayant la meme reference et le même libellé.
    retourne false alors qu'elle contient le même objet.
    Non, elle ne contient pas le même objet : elle contient une instance de Article qui contient les même données, mais pas la même instance. En effet, (a1 != a2) car ces deux références ne pointent pas sur la même zone mémoire.

    Pour comparer le contenu de chaque instance et non leur référence, regarde pour surcharger la fonction equals() qui est utilisé par défaut par les containers (List, Map, ...). en Java il y a deux types de comparaisons:

    - la comparaison sur la référence (ie. le pointeur en équivalent C/C++) qui se fait au moyen de l'opérateur ==

    - la comparaison par rapport au contenu de l'instance elle même. Pour faire cette comparaison, il faut surcharger la fonction Object::equals(Object o).

    C'est pour ça que lorsqu'on veut comparer deux chaînes de caractère, on va:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // ne *PAS* faire
    if (string1 == string2)
     
    // mais faire à la place
    if (string1.equals(string2))
    Lorsque equals() n'est pas surchargé, c'est la version 'par défaut' de la fonction qui est utilisée, soit la version de la classe Object. Et effectivement Object::equals() compare par défaut les références (ce que toi tu ne veux pas). Il te faut donc surcharger la fonction equals() de ta classe Article pour qu'elle compare ce qu'elle a à comparer.

    Par exemple, dans ton cas, tu peux surcharger equals() comme ceci:

    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
     
    public class Article {
     
        // [...]
     
        @Override
        public equals(Object o) {
            // d'abord on vérifie que c'est bien une instance d'Article.
            if (! o instanceof Article)
                 return false;
     
            // après seulement on peut se permettre de 'caster'.
            Article a = (Article)o;
     
            // on compare alors les champs qui nous intéressent
            // ex: libelle de l'article et sa référence).
            return (a.libelle == this.libelle && a.reference == this.reference);
        }
    }

  9. #9
    Membre éclairé
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Par défaut
    merci .
    J'ai préféré utiliser le generate hashcode et equals de Eclipse.

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

Discussions similaires

  1. [AJAX] Récupérer les clés d'un json après une requête ajax
    Par Nico_SAS dans le forum jQuery
    Réponses: 4
    Dernier message: 25/06/2014, 14h18
  2. [MVC] Iterer sur une Hashmap avec les tag spring mvc options
    Par Ytsaeb dans le forum Spring Web
    Réponses: 0
    Dernier message: 31/01/2012, 14h35
  3. [javascript] récupérer les "clés" d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/02/2006, 10h13
  4. [STRUTS] Itérer sur une HashMap
    Par s.grenet dans le forum Struts 1
    Réponses: 5
    Dernier message: 06/04/2005, 13h26

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