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 :

fonction creant hashmap<String,ArrayList<String>


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut fonction creant hashmap<String,ArrayList<String>
    Bonjour j'ai un problème dont j'ai identifié la cause. Mais je ne trouve pas la solution.

    Je suis entrain de m'écrire une class SQLAbstract qui me permet de gérer les requêtes SQL.

    J'ai une méthode

    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
     
    public ArrayList<String> getListColonneRecup() throws SQLException
    {
     
    		 ResultSetMetaData rsmd = this.rs.getMetaData();
    		 int colomnCount = rsmd.getColumnCount();
    		 ArrayList<String> res=new ArrayList<String>();
     
     
    		for(int i=1;i<=colomnCount;i++)
    		{
    			 res.add(rsmd.getColumnName(i));
    		}
    		return res;
     
    }
    Qui me permet de récupérer les nom des colonnes que j'ai cherché grâce à une requête de type select. Elle marche vraiment bien

    Par la suite je voudrais récupérer le résultat dans un tableau associatif du type tableau["nomColonne"] => "liste de valeur associé a cette colonne".

    La cle sera de type String et la liste valeur de type ArrayList<String>.(surement à modifier par la suite mais pour l'instant j'ai besoin de bdd ne contenant que des string).

    Donc j'ai choisi une HashMap<String,ArrayList<String>> pour faire ça. Voici la fonction qui créé le tableau associatif à partir d'un resultSet.

    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
     
     
    	public  HashMap<String, ArrayList<String>>  getListRes() throws SQLException
    	{
    		HashMap<String, ArrayList<String>> res=new HashMap<String, ArrayList<String>>();
     
    		ArrayList<String>l =this.getListColonneRecup();
    		ArrayList<String>temp=new ArrayList<String>();
    		ListIterator<String> it =l.listIterator();
    		String courant;
    		while(it.hasNext())
    		{
     
    			courant=it.next();
    			System.out.println(courant);
    			while(rs.next())
    			{
     
    				temp.add(this.rs.getString(courant));
    			}
                            res.put(courant,temp);
    			temp.clear(); // le probleme est ici
    			this.rs.beforeFirst();
     
    		}
     
    		return res;
    	}
    Le problème se situe au niveau de mon commentaire. Quand je teste ma fonction et si je laisse cette directive il me crée bien un tableau associatif avec les bonnes clé mais elles pointent vers des liste vide. Par contre si j'enlève cette directive j'ai un tableau avec les bonnes clés mais qui pointent sur des listes contenant toutes les valeurs de toutes les colonnes.

    ça doit être normal puisque quand je fais temp.clear() j'efface toute ma liste. Mais je ne sais pas comment faire pour utiliser correctement cette liste "tampon".

    J'ai vraiment du mal à être clair.

  2. #2
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    Il ne faut pas oublier qu'en Java, toutes les instances sont transmises par référence.
    Donc quand tu fais ça, c'est la même liste de String (temp) que tu mets dans chaque element de ta Map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    res.put(courant,temp);
    La solution consiste à créer une nouvelle liste pour chaque élément de ta Map et non pas à vider toujours la même liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //temp.clear(); 
    temp = new ArrayList<String>();

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Merci ça marche

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

Discussions similaires

  1. création de HashMap<ArrayList<String>, ArrayList<String>>
    Par Balbuzard dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/08/2008, 12h18
  2. ArrayList de String
    Par blbird dans le forum Struts 1
    Réponses: 1
    Dernier message: 14/12/2006, 12h28
  3. [C#] Fonction comme MessageBox mais qui renvoie un string
    Par kinou dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/05/2006, 11h40
  4. Réponses: 2
    Dernier message: 11/12/2005, 12h05
  5. [C#] Convertir un ArrayList en String[] ?
    Par Amerok dans le forum ASP.NET
    Réponses: 13
    Dernier message: 06/12/2005, 15h38

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