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.util.Hashmap a partir d'une liste de String


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut java.util.Hashmap a partir d'une liste de String
    Bonjour a tous

    N'etant vraiment pas doué en Java,j'ai besoin de personnes aimant les défis.
    je dispose d'une liste de String. Chaque String de cette liste est de la forme :
    element1_element2_element3 (_ est mon separateur).

    Je voudrais convertir cette List<String> en map<String, map<String, String>> pour que chaque element soit de la forme

    map<element2,map<element1,element3>

    Merci beaucoup

  2. #2
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Salut,
    je comprends pas vraiment l'intérêt de ta deuxième map.
    Sinon sur l'algo:

    - Tu déclares et instancies ta premiere Map, disons map1
    - Tu itères sur ta liste
    - Pour chaque éléme, tu split( ou tokenise) avec ton séparateur
    - Tu vérifie que t'as bien 3 éléments eventuellement
    - Tu déclares et instancies ta deuxieme Map, disons map2
    - tu fais map2.put(elem1, elem3)
    - tu fais map1.put(elem2, map2)

    Note: si plusieurs ligne comporte le même elem2, le dernier put écrasera le précédent.

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Ok merci beaucoup Heimdal

    C'est ce que j'avais commencé a faire. C'est les deux dernières lignes que tu as ecrites que je n'avait pas bien compris (et que je comprends toujours moyennement en fait )

  4. #4
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    J'ai quand meme une question concernant le 2ème put.
    Eclipse me dit que mon 2ème argument doit etre une String -> y a comme un souci.

    Voici ce que j'ai et forcément ca coince au 2ème put

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	Map<String,String> m_map1 = new HashMap<String,String>();
    	Map<String,String> m_map2 = new HashMap<String,String>();	
     
    	for (int i=0; i< m_roles.size(); i++ ) {
    	   String test = m_roles.get(i);
    	   String [] temp = test.split("_");
    	   System.out.println("right = " + temp[0] + "  ***  " + temp[1] + "  ***  " + temp[2]);
    	   m_map2.put(temp[0], temp[2]);
     
     
     
    	   m_map1.put(temp[1], m_map2);	   
    	}
    On peut bien faire une map de map ?

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    j'ai rien dit. J'avais pas vu que j'avais pas déclaré m_map1 comme il faut.
    Bref etourderie ...

    Désolé

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    J'ai tout de même une dernière question.
    Comment je dois faire si je veux visualiser mes resultats ?? si je veux regarder que m_map1 a bien toutes les valeurs que je lui ai données ??

  7. #7
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Re,
    l'instruction put te permet d'ajouter un couple de <clef, valeur> a ta map. Une vieille métaphore bidon l'associe a un ensemble de tiroir dans lequel serait stocké tes objets et qui nécessitent la bonne clef pour pouvoir y accéder.

    Autrement ton code n'est pas en accord avec
    Je voudrais convertir cette List<String> en map<String, map<String, String>> pour que chaque element soit de la forme

    map<element2,map<element1,element3>
    Tu associe a chacune des clefs de la première map la même map2 qui elle contient tous les couples <elem1, elem3>.
    Si je traduis ta phrase en code, une nouvelle instance de map doit etre créé a chaque itération, ce qui donnerait 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
    Map<String,Map<String,String>> m_map1 = new HashMap<String,Map<String,String>>();
     
     
    	for (int i=0; i< m_roles.size(); i++ ) {
    	   String test = m_roles.get(i);
    	   String [] temp = test.split("_");
    	   System.out.println("right = " + temp[0] + "  ***  " + temp[1] + "  ***  " + temp[2]);
               Map<String,String> m_map2 = new HashMap<String,String>();
    	   m_map2.put(temp[0], temp[2]);
     
     
     
    	   m_map1.put(temp[1], m_map2);	   
    	}
    Je ne comprend pas vraiment ce que tu veux faire mais je pense qu'il doit y avoir de meilleures solutions.


    Pour ce qui est du parcours des map, je t'oriente vers la FAQ:

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

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Pour tout te dire, voici ce que je voudrais faire Heimdal :

    Pour le moment, je dispose d'une liste de String de la forme:
    1_MODULE1_WRITE
    1_MODULE1_READ
    1_MODULE2_WRITE
    1_MODULE2_READ
    ...
    Le 1 correspond a un premier ensemble (qui peut etre incrementé, ca peut etre 2,3,4,5 ..., admettons que ce sont des utilisateurs), MODULE1 correspond à un sous ensemble du 1er ensemble (qui peut etre MODULE3, MODULE4, ... admmettons que ce sont des applis auquel l'utilisateur aura accès) et les droits READ et WRITE enfin sur chaque module.

    Ce que je cherche au final est de representer ma List<String> pour pouvoir la réutiliser le mieux possible et donc au début je comptais faire :

    map<String, map<String, String>>
    String 1 = utilisateur
    String 2 = module
    String 3 = droit

    ce qui fait que si je suis l'utilisateur 1, je ne prendrai que map<String, String> qui me correspond.

    mais comme tu me l'as dit dans un precedent post (et c'est là qu'est le drame),

    Note: si plusieurs ligne comporte le même elem2, le dernier put écrasera le précédent.
    voila voila le pourquoi du comment ...

  9. #9
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Ok je comprends mieux et ton idée d'algo est assez approprié bien que peu orienté objet.

    Rien d'insurmontable pour finalisé la construction de ta map, il te faut une liste de String pour les droits (et plus probablement un Set qui est une List sans doublons, a toi de voir et de modifier ca dans ce cas.?) et des verifs si tes maps contiennent déja tel ou tel autres elements avant de l'inserer.

    J'ai pas testé le code ci-dessous, il est pas beau et peut etre meme qu'il ne marche méme pas mais ça t'orientera malgré tout pour faire ce que tu veux:

    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
    Map<String, Map<String, List<String>>> m_map1 = new HashMap<String, Map<String, List<String>>>();
     
    		for (int i = 0; i < m_roles.size(); i++) {
    			String test = m_roles.get(i);
    			String[] temp = test.split("_");
    			System.out.println("right = " + temp[0] + "  ***  " + temp[1] + "  ***  " + temp[2]);
     
    			if(m_map1.containsKey(temp[1])) {
    				Map<String, List<String>> usersMap = m_map1.get(temp[1]);
    				if(usersMap.containsKey(temp[0])) {
    					usersMap.get(temp[0]).add(temp[2]);
    				}
    				else{
    					List<String> rightList = new ArrayList<String>();
    					rightList.add(temp[2]);
    					usersMap.put(temp[0], rightList);
    				}
    			}
    			else {
    				HashMap<String, List<String>> usersMap = new HashMap<String, List<String>>();
    				List<String> rightList = new ArrayList<String>();
    				rightList.add(temp[2]);
    				usersMap.put(temp[0], rightList);
    				m_map1.put(temp[1], usersMap);
    			}
    		}
    Banzai

  10. #10
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    Par défaut
    Mais c'est que ça fait exactement ce que je veux ça (enfin à priori ... )

    Merci beaucoup Heimdal, tu es bien bon

  11. #11
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Pas de quoi, entre deux fichiers de conf moisis ça me détend...

    Si c good, pense au tag résolu.

    See yo

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

Discussions similaires

  1. Fuites mémoire dans une classe "java.util.HashMap$Entry"
    Par ladyingold dans le forum Collection et Stream
    Réponses: 19
    Dernier message: 10/02/2012, 15h51
  2. Réponses: 32
    Dernier message: 22/09/2005, 10h40
  3. Réponses: 3
    Dernier message: 19/05/2005, 17h52
  4. Réponses: 3
    Dernier message: 25/04/2005, 15h26
  5. Trouver equation à partir d'une liste de points
    Par scarabee dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 27/05/2004, 17h05

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