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 :

Java Collection Map<String, Map<String,List<Object>>


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut Java Collection Map<String, Map<String,List<Object>>
    Bonjour Messieurs,
    J’ai un problème sur un programme java que je développe, en effet je chercher à faire une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Map<String, Map<String, List<Objet>>> root = new HashMap<String, Map<String,List<Objet>>>();
    J’ai une classe qui contient cette map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public class KeyReference {
    	String keylabel;
    	Map<String, Map<String, List< Objet >>> root = new HashMap<String, Map<String,List<Objet>>>();
    avec les getters et setters qui vont bien

    Et j’ai une method pour allez remplir cette map si cette Map contient déjà la clé alors on renvoie la list.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public List<Objet> getrootByvalueAndLang(String value,String lang){
    		if(!root.containsKey(value)){
    			root.put(value, new HashMap<String, List<Objet>>());
    			root.get(value).put(lang, new ArrayList<Objet>());
    			return root.get(value).get(lang);
    		}
    		return root.get(value).get(lang);
    	}
    Le problème est quand j’appelle cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	List<Objet> listobjet= keyReference.getrootByvalueAndLang(value, lang);
    	listobjet.add(objet);
    Sur la dernière ligne listobjet.add(objet); java.lang.NullPointerExceptionJe comprends pas trop pourquoi en faite car mon objet n’est pas null alors ca doit venir de ma méthode Mais quand je fais une map a seulement 2 dimension ca marche alors pourquoi quand je rajoute une liste dedans ca ne marche pas ???

    Pour mon code à 2 dimensions ca donne ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Map<String , Map<String, String>> root = new HashMap<String, Map<String,String >>();
     
    public Map<String, String> getrootbyKey(String key){
    	if(!root.containsKey(key)){
    		root.put(key, new HashMap<String, String>());
    		return root.get(key);
    	}
    	return root.get(key);
    }
    La je n’ai pas de NullPointerExeception je comprends plus trop … Si quelqu’un connais le problème ?

    Encore merci pour vos réponses.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 093
    Par défaut
    Si comme tu le dit, tu obtiens un nullpointeur sur cette ligne :

    Alors c'est que listobjet est NULL ... mais comme ne montres pas ton code, listobjet, on sait pas d'ou il vient ... donc difficile de t'aider.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Objet> listobjet= keyReference.getrootByvalueAndLang(value, lang);
    listobjet.add(objet);
    Pardon j'avais fait un truc pas terrible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ma list<Objet> recoit la List de ma fonction.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    Alors là ...( moi pas comprendre ) ca marche quand je fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Map<String, List<Objet>> getrootByvalue(String value) {
    		if (!root.containsKey(value)) {
    			root.put(value, new HashMap<String, List<Objet>>());
    			return root.get(value);
    		}
    		return root.get(value);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    	public List<BU> getrootBylang(Map<String, List<Objet>> map, String lang) {
    		if (!map.containsKey(lang)) {
    			map.put(lang, new ArrayList<Objet>());
    			return map.get(lang);
    		}
    		return map.get(lang);
    	}
    Et quand j'appelle ma Map dans mon Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		List<Objet> listObjet = keyReference.getrootBylang(keyReference.getrootByvalue(value), lang);
    	listObjet.add(Objet);
    La pas de problème il me set les objet dans ma list mais avec la solution du dessu quand j'essai de faire tout dans une fonction ca me pose problème pourquoi NullPointer...???

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    C'est parce que ton premier code crée à la fois la sous-Map et la List quand il ne trouve pas la clé dans la sur-Map.

    Par contre, s'il trouve la clé dans la sur-Map, il ne crée rien : ni sous-Map (normal) ni List (qui n'a pourtant aucune raison d'exister, vu qu'à aucun moment tu n'as vérifié si la sous-Map contenait la clé lang.)

    Du coup, des fois la List n'existe pas, et get() sur la sous-Map renvoie null.
    Je ne trouve pas ça très compliqué, c'est d'ailleurs mis en évidence par ton deuxième essai.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Bonjour,
    Jepense que le problème vient du fait que vous ne tester pas si la "lang" existe ou non dans votre map interne.
    De plus, évitez de faire un get d'une valeur que vous venez d'ajouter dans votre liste. Il est plus simple de mémorisé la valeur.
    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
    27
    28
     
    Map<String, Map<String, List<Objet>>> root = new HashMap<String, Map<String,List<Objet>>>();
    public List<Objet> getrootByvalueAndLang(String value,String lang){
    List<Objet> returnedList=null;
    // Test sur l’existence de la clé value
    	if(!root.containsKey(value)){
    		Map<String, List<Objet>> interneMap = root.get(value);
    		root.put(value, interneMap);
    		returnedList = new ArrayList<Objet>();
    		interneMap.put(lang, returnedList );
    		return returnedList ;
    	}
    	else{
     
    		// Test sur l’existence de la clé lang
    		if(!interneMap.containsKey(lang))
    		{
    			Map<String, List<Objet>> interneMap = root.get(value);
    			List<Objet> returnedList = new ArrayList<Objet>()
    			interneMap.put(lang, returnedList);
    		}
    		else
    		{
    			returnedList = root.get(value).get(lang);
    		}
    	}
    return returnedList;
    }
    Cordialement,
    Patrick Kolodziejczyk.

    PS: Je vous conseil de faire des méthode qui ne gère qu'un seul niveau d'emboitement à la fois.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 121
    Par défaut
    Non ba c'est bon c'est juste que je sus débile. En tout cas merci.

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

Discussions similaires

  1. map< string, map<string, vector<float> > >
    Par dauphin11 dans le forum Langage
    Réponses: 8
    Dernier message: 21/11/2011, 20h46
  2. Construire une map<string, map<int, string> >
    Par jamsgoodon dans le forum Débuter
    Réponses: 2
    Dernier message: 23/02/2011, 19h53
  3. [Débutant] string map avec une variable en argument
    Par barthelv dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 27/08/2010, 16h49
  4. Comment trier une map de type Map<String, Map<Integer, Integer>>
    Par khalidlyon dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 12/01/2010, 14h31
  5. Map:Clé composé de deux String
    Par progamer54 dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 23/05/2006, 17h59

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