[newbie] ArrayList et HashMap pb passage d'argument
4 réponses
yvon.thoravalNO-SPAM
bon, je remplis une HashMap à partir d'une lecture d'une bdd, je
souhaite obtenir une HashMap ayant pour clés les noms des tables de
cette bdd.
je rencontre un problème de passage d'argument, et, si j'ai bien intuité
c'est la référence, à cols (l'ArrayList courante représentant les noms
des colonnes d'une table) et non pas sa valeur qui est affectée à la clé
correspondante.
je ne pige pas ce que je dois faire pour contourner ce problème.
le code :
for (int i = 0; i < tables.size(); i++) {
t = (String) tables.get(i);
rs = dbmd.getColumns(null, null, t, null);
cols.clear();
while (rs.next()) {
col = rs.getString ("column_name");
cols.add((String) col);
}
System.out.println(t + " columns = " + cols);//** ici cols change **
tableMap.put((String) t,(ArrayList) cols);
}
System.out.println("tableMap = " + tableMap);//** ici cols change pas **
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Christophe M
Yvon Thoraval wrote:
bon, je remplis une HashMap à partir d'une lecture d'une bdd, je souhaite obtenir une HashMap ayant pour clés les noms des tables de cette bdd.
je rencontre un problème de passage d'argument, et, si j'ai bien intuité c'est la référence, à cols (l'ArrayList courante représentant les noms des colonnes d'une table) et non pas sa valeur qui est affectée à la clé correspondante.
je ne pige pas ce que je dois faire pour contourner ce problème.
le code :
for (int i = 0; i < tables.size(); i++) { t = (String) tables.get(i); rs = dbmd.getColumns(null, null, t, null); cols.clear(); while (rs.next()) { col = rs.getString ("column_name"); cols.add((String) col); } System.out.println(t + " columns = " + cols);//** ici cols change ** tableMap.put((String) t,(ArrayList) cols); } System.out.println("tableMap = " + tableMap);//** ici cols change pas **
Tu dois créer une nouveal ArrayList pour chaque table que tu gères. Ici comme tu utilises tjrs la même instance dans cols, et que tu fais des clear() un peu partout, tu ne trouveras dans cols que la liste des champs de la dernière table.
Autre solution : tableMap.put((String) t,(ArrayList) cols.clone());
mais faut voir si la méthode clone à bien été implémentée pour l'arraylist ;-)
Yvon Thoraval wrote:
bon, je remplis une HashMap à partir d'une lecture d'une bdd, je
souhaite obtenir une HashMap ayant pour clés les noms des tables de
cette bdd.
je rencontre un problème de passage d'argument, et, si j'ai bien intuité
c'est la référence, à cols (l'ArrayList courante représentant les noms
des colonnes d'une table) et non pas sa valeur qui est affectée à la clé
correspondante.
je ne pige pas ce que je dois faire pour contourner ce problème.
le code :
for (int i = 0; i < tables.size(); i++) {
t = (String) tables.get(i);
rs = dbmd.getColumns(null, null, t, null);
cols.clear();
while (rs.next()) {
col = rs.getString ("column_name");
cols.add((String) col);
}
System.out.println(t + " columns = " + cols);//** ici cols change **
tableMap.put((String) t,(ArrayList) cols);
}
System.out.println("tableMap = " + tableMap);//** ici cols change pas **
Tu dois créer une nouveal ArrayList pour chaque table que tu gères.
Ici comme tu utilises tjrs la même instance dans cols, et que tu fais
des clear() un peu partout, tu ne trouveras dans cols que la liste des
champs de la dernière table.
Autre solution :
tableMap.put((String) t,(ArrayList) cols.clone());
mais faut voir si la méthode clone à bien été implémentée pour
l'arraylist ;-)
bon, je remplis une HashMap à partir d'une lecture d'une bdd, je souhaite obtenir une HashMap ayant pour clés les noms des tables de cette bdd.
je rencontre un problème de passage d'argument, et, si j'ai bien intuité c'est la référence, à cols (l'ArrayList courante représentant les noms des colonnes d'une table) et non pas sa valeur qui est affectée à la clé correspondante.
je ne pige pas ce que je dois faire pour contourner ce problème.
le code :
for (int i = 0; i < tables.size(); i++) { t = (String) tables.get(i); rs = dbmd.getColumns(null, null, t, null); cols.clear(); while (rs.next()) { col = rs.getString ("column_name"); cols.add((String) col); } System.out.println(t + " columns = " + cols);//** ici cols change ** tableMap.put((String) t,(ArrayList) cols); } System.out.println("tableMap = " + tableMap);//** ici cols change pas **
Tu dois créer une nouveal ArrayList pour chaque table que tu gères. Ici comme tu utilises tjrs la même instance dans cols, et que tu fais des clear() un peu partout, tu ne trouveras dans cols que la liste des champs de la dernière table.
Autre solution : tableMap.put((String) t,(ArrayList) cols.clone());
mais faut voir si la méthode clone à bien été implémentée pour l'arraylist ;-)
yvon.thoravalNO-SPAM
Christophe M <mccricri_at_hotmail.com> wrote:
Tu dois créer une nouveal ArrayList pour chaque table que tu gères. Ici comme tu utilises tjrs la même instance dans cols, et que tu fais des clear() un peu partout, tu ne trouveras dans cols que la liste des champs de la dernière table.
ben oui, je faisais des clear un peut partout because cols, autrement, me donnait la liste de toutes les colonnes de toutes les tables...
Autre solution : tableMap.put((String) t,(ArrayList) cols.clone());
mais faut voir si la méthode clone à bien été implémentée pour l'arraylist ;-)
dans un autre fil, on m'a conseillé de faire : cols = new ArrayList(); à la place de cols.clear(); donc, si j'ai bien pigé ça change alors la ref et j'obtiens le bon résultat.
apperemment ça ne marche pas clone() sur ArrayList j'ai essayé :
bon, en tout cas merci, c'était bien un pb de ref simple à solutionner... -- yt
Christophe M <mccricri_at_hotmail.com> wrote:
Tu dois créer une nouveal ArrayList pour chaque table que tu gères.
Ici comme tu utilises tjrs la même instance dans cols, et que tu fais
des clear() un peu partout, tu ne trouveras dans cols que la liste des
champs de la dernière table.
ben oui, je faisais des clear un peut partout because cols, autrement,
me donnait la liste de toutes les colonnes de toutes les tables...
Autre solution :
tableMap.put((String) t,(ArrayList) cols.clone());
mais faut voir si la méthode clone à bien été implémentée pour
l'arraylist ;-)
dans un autre fil, on m'a conseillé de faire :
cols = new ArrayList(); à la place de cols.clear();
donc, si j'ai bien pigé ça change alors la ref et j'obtiens le bon
résultat.
apperemment ça ne marche pas clone() sur ArrayList j'ai essayé :
Tu dois créer une nouveal ArrayList pour chaque table que tu gères. Ici comme tu utilises tjrs la même instance dans cols, et que tu fais des clear() un peu partout, tu ne trouveras dans cols que la liste des champs de la dernière table.
ben oui, je faisais des clear un peut partout because cols, autrement, me donnait la liste de toutes les colonnes de toutes les tables...
Autre solution : tableMap.put((String) t,(ArrayList) cols.clone());
mais faut voir si la méthode clone à bien été implémentée pour l'arraylist ;-)
dans un autre fil, on m'a conseillé de faire : cols = new ArrayList(); à la place de cols.clear(); donc, si j'ai bien pigé ça change alors la ref et j'obtiens le bon résultat.
apperemment ça ne marche pas clone() sur ArrayList j'ai essayé :