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 :

Boucle HashMap paramétrée


Sujet :

Collection et Stream Java

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut Boucle HashMap paramétrée
    Bonjour,

    Je définis une HashMap paramétrée de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HashMap<String,ArrayList<String>> personnes = new HashMap<String,ArrayList<String>>();
    Jusque là, tout va bien. Après l'avoir remplis, j'ai une partie du code qui boucle sur les clés/valeurs de cette HashMap, mais j'ai un problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for ( Iterator iter = personnes.entrySet().iterator(); iter.hasNext(); ) {
     Map.Entry ent = (Map.Entry) iter.next();
     //La clé de la HashMap
     String idPerson = (String)ent.getKey();
     //La Valeur de la HashMap
     ArrayList<String> valeur = (ArrayList<String>) ent.getValue();
     //Traitement
    }
    Je suis obligé de laisser les cast, provoquant donc un warning pour "(ArrayList<String>)". Où ai-je raté une étape ?
    Pensez au tag quand votre problème est réglé !

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

    Citation Envoyé par JohnNC Voir le message
    Où ai-je raté une étape ?
    L'erreur vient simplement du fait que tu n'utilises pas de paramétrage sur l'Iterator. Le compilateur ne peut donc pas vérifier la cohérence des types, ce qui amène aux casts et aux warnings...

    Ton code devrait plutôt ressembler à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	for (Iterator<Map.Entry<String, ArrayList<String>>> iter = personnes.entrySet().iterator(); iter.hasNext();) {
    		Map.Entry<String, ArrayList<String>> ent = iter.next();
    		// La clé de la HashMap
    		String idPerson = ent.getKey();
    		// La Valeur de la HashMap
    		ArrayList<String> valeur = ent.getValue();
    		// Traitement
    	}
    Quoique je te conseillerais d'utiliser la boucle for étendu de Java 5.0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	for (Map.Entry<String, ArrayList<String>> entry : personnes.entrySet()) {
    		// La clé de la HashMap
    		String idPerson = entry.getKey();
    		// La Valeur de la HashMap
    		ArrayList<String> valeur = entry.getValue();
    		// Traitement
    	}

    Et j'aurais même tendance à te conseiller de faire un maximum d'abstraction des implémentation. C'est à dire d'utiliser les interfaces Map et List à la place des types concret HashMap et ArrayList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	Map<String, List<String>> personnes = new HashMap<String, List<String>>();
     
    	for (Map.Entry<String, List<String>> entry : personnes.entrySet()) {
    		// La clé de la HashMap
    		String idPerson = entry.getKey();
    		// La Valeur de la HashMap
    		List<String> valeur = entry.getValue();
    		// Traitement
    	}

    a++

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    Ha merci ! Je n'avais pas pensé à l'itérateur, puisque l'info-bulle d'eclipse me donnait bien les paramètres Du coup, je vais prendre ta seconde solution.

    Par contre, pour la troisième (utiliser les interfaces au lieu des types concret), j'ai une question. Dans mes recherches, j'ai lu un post où celà posait problème. Je ne retrouve plus le post exact, où le problème était bien détaillé, mais j'en ai un qui ressemble sur ce post.
    Je cite :
    Citation Envoyé par gronono Voir le message
    Bonjour,

    Lorsque tu fais A a1 = new A1() la variable a1 est du type A. Donc la méthode appelée est transform(A, Object).

    Par contre si tu déclares A1 a1 = new A1() la variable a1 est du type A1. Donc la méthode appelée est transform(A1, Object).

    Si si tu déclares A a1 = new A1() et que tu appelle transform par transform(a1, "test") alors tu force le type de a1 en A1.

    Dans le premier cas, la JVM considère que a1 est de type A
    Dans le second, de type A1 (il est déclaré explicitement)
    Dans le troisième de type A1 (c'est toi qui force)

    L'important est le type de la déclaration et non le type de l'instance.

    Il existe des exemples dans l'API standard:
    soit une ArrayList l.
    Si tu la déclare ArrayList l = new ArrayList(), tu peux utiliser la méthode add(int index, E element)
    Par contre si tu la déclare Collection l = new ArrayList(), tu ne peux utiliser la méthode add(int index, E element) .
    Est-ce que je risque pas d'avoir des erreurs toutes bêtes (genre une méthode que je ne retrouve pas, car non présente dans l'interface) ? (Autrement dis, comment tu les gères ?)
    Pensez au tag quand votre problème est réglé !

  4. #4
    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
    Il y a quelque cas particulier où l'on a besoin du type précis... mais pas dans 95% des cas !


    En particulier pour les collections, où les interfaces sont plutôt complète.

    Ton code est super réducteur : tu ne peux utiliser qu'une HashMap et qu'une ArrayList. Or il existe un grand nombre de Map et de List que tu pourrais utiliser...

    a++

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 268
    Points : 199
    Points
    199
    Par défaut
    D'accord, merci pour l'info ! Quitte à passer sur JAVA 5, je vais en profiter pour approfondir mes connaissances et utilisations
    Pensez au tag quand votre problème est réglé !

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

Discussions similaires

  1. boucle for paramêtres
    Par xavierdestev dans le forum Débuter
    Réponses: 5
    Dernier message: 28/09/2013, 20h33
  2. boucle à deux paramètres
    Par une_tite_question dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/10/2008, 14h51
  3. AddEvent affectation événement, boucle, et paramètres
    Par speedev dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/09/2008, 16h03
  4. Réponses: 8
    Dernier message: 20/09/2007, 18h58
  5. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55

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