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 :

[HashMap] Initialisation directe


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut [HashMap] Initialisation directe
    Bonjour,

    J'ai une hashmap "static" et je cherche à l'initialiser à l'instanciation de ma classe.
    En fait je cherche à savoir s'il est possible de faire la même chose qu'avec un tableau, cad :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private static final String[] monTableau = {"str1","str2","str3"};
    mais avec une HashMap en lui passant directement les couples clé/valeur.

    Est-ce possible? si oui comment svp.

    Merci d'avance

  2. #2
    Membre expérimenté
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Par défaut
    Vu les constrcteur existant je ne pense pas que cela soit possible d'initialiser ta HashMap a la declaration.

  3. #3
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Tu peux faire un bloc static

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static
    {
        initialisation
    }
    plus concrètement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private static HashMap<Integer,String> map = new HashMap<Integer,String>();
    static
    {
        map.put(1,"toto");
        map.put(2,"titi");
    }

  4. #4
    Membre averti
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    je ne connais pas bien l'utilisation des blocs static. Tu peux m'en dire un peu + stp

    Edit : j'allais oublier : merci pour vos réponses rapides ^^

  5. #5
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806

  6. #6
    Membre averti
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Un de mes collègues a trouvé ca quelque part sur le net :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private static final HashMap<String,Boolean> myMap = 
    new HashMap() {{ put("j1", "true");}{ put("j2", "true");}};
    Que pensez-vous de ce code?

    PS : je suis toujours intéressé par quelques explications sur les blocs static. Ils sont exécutés à l'onstanciation de la classe?

  7. #7
    Membre averti
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Merci pour le lien c'est + clair

  8. #8
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Par défaut
    Bonjour,

    j'avais le même soucis que bibiodp et donc cette initialisation avec un bloc static semblait résoudre mon problème sauf que ça n'est pas le cas.
    Je vous explique : j'ai une classe Constantes qui contient ma HashMap static avec le bloc static d'initialisation juste dessous. Dans le code de mon appli, j'appelle la constante LISTE_TYPE_NOEUDS_DYNAMIQUE définie encore en dessous et là ça me met une "java.lang.ExceptionInInitializerError Caused by: java.lang.ClassCastException: [Ljava.lang.Object;" ?!?

    Ci-dessous le code de ma classe Constantes :
    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
        /**
         * Ma HashMap static
         */
        private static final HashMap<String, NoeudAffiche> NOEUD_ARBO = new HashMap<String, NoeudAffiche>();
     
        static {
            NOEUD_ARBO.put("String 1", new NoeudAffiche("String 1"));
            NOEUD_ARBO.put("String 2", new NoeudAffiche("String 2"));
            NOEUD_ARBO.put("String 3", new NoeudAffiche("String 3"));
            NOEUD_ARBO.put("String 4", new NoeudAffiche("String 4"));
            NOEUD_ARBO.put("String 5", new NoeudAffiche("String 5"));
            NOEUD_ARBO.put("String 6", new NoeudAffiche("String 6"));
            NOEUD_ARBO.put("String 7", new NoeudAffiche("String 7"));
            NOEUD_ARBO.put("String 8", new NoeudAffiche("String 8"));
            NOEUD_ARBO.put("String 9", new NoeudAffiche("String 9"));
            NOEUD_ARBO.put("String 10", new NoeudAffiche("String 10"));
        }
     
        /**
         * Renvoie la liste des clés de ma HashMap sous forme de tableau de String.
         * @return la liste des clés de ma HashMap sous forme de tableau de String.
         */
        public static final String[] LISTE_TYPE_NOEUDS_DYNAMIQUE = (String[]) NOEUD_ARBO.keySet().toArray();
    et l'appel dans mon appli :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] listeNoms = Constantes.LISTE_TYPE_NOEUDS_DYNAMIQUE;
    Comment donc faire pour que ma HashMap soit correctement initialisée avant l'appel dans mon appli ? Sachant que je souhaite ne pas avoir à instancier ma classe Constantes ...

  9. #9
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    essai avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final String[] LISTE_TYPE_NOEUDS_DYNAMIQUE = NOEUD_ARBO.keySet().toArray(new String[0]);

  10. #10
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Par défaut
    pas mieux, ça me pète un nullPointerException ...

    merci quand même pour la réponse

  11. #11
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    avec ca :

    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
    public class Constantes {
    	/**
            * Ma HashMap static
            */
    	private static final HashMap<String, NoeudAffiche> NOEUD_ARBO = new HashMap<String, NoeudAffiche>();
     
    	static {
    		NOEUD_ARBO.put("String 1", new NoeudAffiche("String 1"));
    		NOEUD_ARBO.put("String 2", new NoeudAffiche("String 2"));
    		NOEUD_ARBO.put("String 3", new NoeudAffiche("String 3"));
    		NOEUD_ARBO.put("String 4", new NoeudAffiche("String 4"));
    		NOEUD_ARBO.put("String 5", new NoeudAffiche("String 5"));
    		NOEUD_ARBO.put("String 6", new NoeudAffiche("String 6"));
    		NOEUD_ARBO.put("String 7", new NoeudAffiche("String 7"));
    		NOEUD_ARBO.put("String 8", new NoeudAffiche("String 8"));
    		NOEUD_ARBO.put("String 9", new NoeudAffiche("String 9"));
    		NOEUD_ARBO.put("String 10", new NoeudAffiche("String 10"));
     
    	}
     
    	public static final String[] LISTE_TYPE_NOEUDS_DYNAMIQUE = NOEUD_ARBO.keySet().toArray(new String[0]);
    }
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class NoeudAffiche {
    	String string;
     
    	public NoeudAffiche(String string) {
    		this.string = string;
    	}
     
    	@Override
    	public String toString() {
    		return string;
    	}
     
    }
    et finalement pour testé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static void main(String[] args) {
     
    		String[] listeTypeNoeudsDynamique = Constantes.LISTE_TYPE_NOEUDS_DYNAMIQUE;
    		for (String string : listeTypeNoeudsDynamique) {
    			System.out.println(string);
    		}
     
    	}
    ca m'affiche ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String 4
    String 6
    String 1
    String 3
    String 9
    String 7
    String 5
    String 10
    String 8
    String 2

  12. #12
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Par défaut
    Chez moi ça ne marche pas, à priori un paramétrage de la JRE ?!?
    J'ai donc instancié la HashMap dans le bloc static et au passage je l'ai transformée en non final (je sais plus pourquoi maintenant que j'y repense). Et enfin j'ai utilisé ta technique pour le castage et là ça marche

    Merci en tout cas pour le coup de main

    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
    24
    25
    26
        /**
         * Ma HashMap static
         */
        private static HashMap<String, NoeudAffiche> noeudArbo;
     
        /**
         * Renvoie la liste des clés de ma HashMap sous forme de tableau de String.
         * @return la liste des clés de ma HashMap sous forme de tableau de String.
         */
        public static final String[] LISTE_TYPE_NOEUDS_DYNAMIQUE;
     
        static {
            noeudArbo = new HashMap<String, NoeudAffiche>()
            noeudArbo.put("String 1", new NoeudAffiche("String 1"));
            noeudArbo.put("String 2", new NoeudAffiche("String 2"));
            noeudArbo.put("String 3", new NoeudAffiche("String 3"));
            noeudArbo.put("String 4", new NoeudAffiche("String 4"));
            noeudArbo.put("String 5", new NoeudAffiche("String 5"));
            noeudArbo.put("String 6", new NoeudAffiche("String 6"));
            noeudArbo.put("String 7", new NoeudAffiche("String 7"));
            noeudArbo.put("String 8", new NoeudAffiche("String 8"));
            noeudArbo.put("String 9", new NoeudAffiche("String 9"));
            noeudArbo.put("String 10", new NoeudAffiche("String 10"));
            // initialisation de la liste :
            LISTE_TYPE_NOEUDS_DYNAMIQUE = noeudArbo.keySet().toArray(new String[0]);
        }

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par OphyTe Voir le message
    Chez moi ça ne marche pas, à priori un paramétrage de la JRE ?!?
    Non. Ou alors, l'utilisation d'une JRE ou JVM particulièrement buggée au lieu de l'officielle.

    Je ne sais pas ce qui t'est arrivé, mais ces deux codes marchent et ne font pas de NullPointerException.

    Remarques supplémentaires :
    - Initialiser la Map lors de sa déclaration, ou au début du bloc statique, c'est la même chose. Littéralement. C'est sémantiquement équivalent, le compilateur ne fait pas de différence, et compilera la même chose dans les deux cas.

    - Que la variable Map soit final ou pas ne change pas grand-chose à la question. Final signifie qu'on ne peut pas lui assigner à nouveau une Map. Ce qui n'arrive pas dans ce code. Ça ne compile pas pareil, c'est vrai, mais il n'y a rien là-dedans qui fait du NullPointerException.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    A ma connaissance, la seule chose qui peut varier d'une JRE à l'autre, c'est l'ordre des éléments quand tu les récupères depuis ta HashMap.

    A noter que ce comportement est normal (cf. javadoc) et que si l'on veut avoir un ordre (ordre d'insertion ou de tri), il faut utiliser une autre implémentation (LinkedHashMap ou TreeMap respectivement).

  15. #15
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 60
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Non. Ou alors, l'utilisation d'une JRE ou JVM particulièrement buggée au lieu de l'officielle.
    pourtant la JRE que j'utilise est celle fournie avec Weblo10 à savoir la 1.5.0_06 ...
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)

  16. #16
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    le problème était la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LISTE_TYPE_NOEUDS_DYNAMIQUE = noeudArbo.keySet().toArray(new String[0]);
    il faut bien préciser le new String[0] dans le toArray, je tombe dans ce piège a chaque fois ...

  17. #17
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tu veux dire que tu avais posté une solution erronée que tu as corrigée plus tard ?

    (En tout cas, ça peut faire ClassCastException, mais il faut carrément un null pour un NullPointerException.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Membre éclairé Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Par défaut
    j'ai pas posté de solution erroné ... j'ai corrigé des fautes d'orthographe. par contre si il a un null pointeur exception c'est que ca viens d'ailleurs ...

Discussions similaires

  1. Problème initialisation Hashmap
    Par tomy29 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 01/12/2008, 18h27
  2. [Framework] [IoC] initialisation de HashMap
    Par robert_trudel dans le forum Spring
    Réponses: 1
    Dernier message: 05/08/2008, 14h26
  3. struts.xml initialiser hashmap
    Par worldchampion57 dans le forum Struts 2
    Réponses: 2
    Dernier message: 14/01/2008, 21h25
  4. Initialisation HashMap dans interface
    Par vince_grenoblois dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 16/08/2006, 00h30
  5. La communauté Direct X est au repos?
    Par Shakram dans le forum DirectX
    Réponses: 21
    Dernier message: 18/07/2002, 23h32

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