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 :

Utiliser une Map pour stocker des informations


Sujet :

Collection et Stream Java

  1. #1
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut Utiliser une Map pour stocker des informations
    bonjour,

    Je veux utiliser un Map pour stocker des informations et voici deux traitements possibles pour déclarer Map:

    Le premier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static HashMap<String,String> maMap = new HashMap<String,String>();
    Le deuxième:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static Map maMap = new HashMap();
    Laquelle c'est la bonne déclaration?


    Et voici le traitement pour initialiser Map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    maMap.put("cle1","val1");
    maMap.put("cle2","val2");
    Traitement pour récupérer les données ou bien parcourir Map:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    String valeur;
    String key;
    Iterator it;
    it= maMap.keySet().iterator();
    while (it.hasNext)
    {
         key = (String)it.next()
         System.out.println(key);
         valeur= maMap.get(key);
         System.out.println(valeur);
    }
    Est ce que mon code est bien ou bien il y a la possibilité d'optimiser mon code ?
    Merci d'avance

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Généralement il vaut mieux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static Map<String,String> maMap = new HashMap<String,String>();
    Sinon, si tu veux parcourir ta Map, oui tu dois passer par un itérateur pas très joli ; en même temps la Map n'est pas spécialement faite pour être ainsi parcourue (ce n'est pas son objectif premier ^^).

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Tout de même, pour le parcours on peut faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Map.Entry<String, String> entry : map.entrySet()) {
      System.out.println(entry.getKey());
      System.out.println(entry.getValue());
    }
    Ça évite de devoir résoudre toutes les clés, et puis ça évite aussi de se taper soi-même l'itérateur.

  4. #4
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Points : 13 670
    Points
    13 670
    Par défaut
    Première étape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HashMap map = new HashMap();
    Map map = new HashMap();
    Il n'y a pas de différence mis à part que map est en type plus générique sur la deuxième proposition. Il est possible de la réutiliser pour un autre type proche :
    Ceci ne fonctionnerait que dans le deuxième cas. Donc en général, il faut déclarer les variables à l'aide d'interface qui rende le code plus souple. Donc utilise la deuxième notation.

    Deuxième étape :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Map<String,String> map = new HashMap<String,String>();
    Map map = new HashMap();
    La première proposition type ses valeurs, c'est préférable si l'on est sur du type de son contenu. D'après ton exemple, tu sembles sur que ta Map contiendra des String donc utilise la première. La deuxième proposition te permet d'insérer à peu près n'importe quoi dans ta Map.

    Pour les bonnes façons de parcourir une Map : Cf. ici

  5. #5
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    Merci pour vos réponses

    Mais pour cette déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map<String,String> map = new HashMap<String,String>();
    Elle n’a pas admis pas le compilateur 1.4
    J’ai une autre question si on a le compilateur 1.4 alors on travaille par Java4 et pour 1.5 c’est de java 5 ?

    Et ce que je peux faire ce traitement, pour voir si la cle n’existe pas avec sa valeur avec j’insère dans Map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If(maMap.get(cle) != null)
    {maMap.put(cle,val);
    }

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par sonia5 Voir le message
    Merci pour vos réponses

    Mais pour cette déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map<String,String> map = new HashMap<String,String>();
    Elle n’a pas admis pas le compilateur 1.4
    Normal. Les « generics » (la syntaxe <*>) ne sont valides que pour les versions de Java à partir de 1.5.

    Citation Envoyé par sonia5 Voir le message
    J’ai une autre question si on a le compilateur 1.4 alors on travaille par Java4 et pour 1.5 c’est de java 5 ?
    « Java 4 » n'existe pas : on ne parle que de Java 1.4. Les dénominations en raccourci « Java 5/6/7... » ne sont utilisées que depuis Java 1.5.

    Citation Envoyé par sonia5 Voir le message
    Et ce que je peux faire ce traitement, pour voir si la cle n’existe pas avec sa valeur avec j’insère dans Map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If(maMap.get(cle) != null)
    {maMap.put(cle,val);
    }
    « if » doit rester tout en minuscules. À part ça, pour tester l'existence de la clé, il y a plus fiable que « if(maMap.get(cle) != null) » : la méthode Map.containsKey() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }

  7. #7
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    Merci,
    Je pense pour ce test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }
    On doit le remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }
    c a d, si il n existe pas on insère

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Citation Envoyé par sonia5 Voir le message
    Mais pour cette déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map<String,String> map = new HashMap<String,String>();
    Elle n’a pas admis pas le compilateur 1.4
    Non, en effet. Mais 1.4 est complètement obsolète, on en est à 1.7 maintenant. Si ça ne t'est pas absolument impossible, tu dois vraiment passer à une version supérieure. Idéalement 1.6 ou 1.7, en fonction de si tu te sens pionnier ou pas.

    Citation Envoyé par sonia5 Voir le message
    Et ce que je peux faire ce traitement, pour voir si la cle n’existe pas avec sa valeur avec j’insère dans Map

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If(maMap.get(cle) != null)
    {maMap.put(cle,val);
    }
    Ça me semble un peu contradictoire. Tu peux nous dire ce que tu essaies de faire en bon français clair ? (Et aussi dans quel but, au cas où...)

  9. #9
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    D'accord,

    J'essaye d’insérer la valeur ou cas ou je ne trouve pas sa clé?

    Et je pense la meilleur solution :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par sonia5 Voir le message
    Merci,
    Je pense pour ce test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }
    On doit le remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }
    c a d, si il n existe pas on insère
    Au temps pour moi : si j'avais été plus attentif à l'énoncé (comme l'a été Thelvin), j'aurais vu la confusion dans ton code et ne l'aurais pas répercutée

  11. #11
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    Pourquoi
    Je veux voir si l 'élément n’existe pas dans ma Map, alors je l’insère sachant que pour chaque valeur à une clé unique
    Ou se trouve contradictoire?

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par sonia5 Voir le message
    Pourquoi
    Je veux voir si l 'élément n’existe pas dans ma Map, alors je l’insère sachant que pour chaque valeur à une clé unique
    Ou se trouve contradictoire?
    Dans le fait que ton premier traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If(maMap.get(cle) != null)
    {maMap.put(cle,val);
    }
    donnait ceci : si la clé était présente dans la Map et non "null", alors on lui affectait "val"... Ce qui n'est pas vraiment la même chose

  13. #13
    Débutant  
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 346
    Points : 86
    Points
    86
    Par défaut
    Désolé, c'est vrai vous avez raison
    Je dois faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(maMap.get(cle) == null)
    {maMap.put(cle,val);
    }
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!maMap.containsKey(cle)) {
        maMap.put(cle, val);
    }
    Mais ce deuxième test est mieux que le premier?

  14. #14
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut
    Oui, car :

    - si tu consultes l'API, tu liras que l'interface Map et la classe HashMap qui l'implémente autorisent des valeurs "null" (voire la clé "null" !). Ce qui implique que le test peut parfaitement retourner "true" si maMap contient la clé "cle", pourvu qu'elle soit associée à la valeur "null" !

    - En revanche, le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    !maMap.containsKey(cle)
    garantit de retourner "true" si et seulement si la clé "cle" est absente de maMap.

  15. #15
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2008
    Messages : 73
    Points : 195
    Points
    195
    Par défaut
    Et ne pas oublier de passer le sujet en "Résolu" le cas échéant

    Edit : Je rêvais de la sortir un jour, celle-ci

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/09/2009, 23h51
  2. Réponses: 10
    Dernier message: 06/02/2008, 17h35
  3. Files Mapping pour stocker des structures de données
    Par Targan dans le forum Débuter
    Réponses: 0
    Dernier message: 27/12/2007, 11h38
  4. Utiliser une variable pour mettre des étiquettes visible
    Par patate5555 dans le forum VBA Access
    Réponses: 8
    Dernier message: 21/06/2007, 13h51
  5. Utiliser une variable pour stocker les noms d'objets.
    Par en_gel_ho dans le forum Access
    Réponses: 4
    Dernier message: 03/01/2007, 16h44

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