gratifiant > comp.lang.* > comp.lang.java

Yvon Thoraval (18/02/2004, 15h02)
je remplis une HashMap avec comme clés les noms des tables d'une bdd et
comme valeur la liste des noms des colonnes pour une clé donnée :

remplissage :

tableMap.put((String) t,(ArrayList) cols);

avec, par ex t = "t_mesure_msr"
et cols obtenu par :
cols.clear();
cols.add(col);
col étant une (String) du genre "msr_id";

bien sûr j'ai vérifié au remplissage que cols.size() est non nulle

Mais quand je veux itérer sur la Hash Map :

for (int i = 0; i < tables.size(); i++) {
t = (String) tables.get(i);
System.out.println(" " + t);
cols.clear();
cols = (ArrayList) tableMap.get((String) t);
for (int j = 0; j < cols.size(); j++) {
col = (String) cols.get(j);
System.out.println(" " + col);
}
}

cols.size() est tjs à 0, je pense que ce qui ne va pas, c'est le
"tableMap.get((String) t)" et donc très vraisemblablement le
tableMap.put((String) t,(ArrayList) cols);

car il est spécifié que la clé est un objet ???
jerome moliere (18/02/2004, 15h15)
Yvon Thoraval wrote:

[..]
> col étant une (String) du genre "msr_id";
> bien sûr j'ai vérifié au remplissage que cols.size() est non nulle
> Mais quand je veux itérer sur la Hash Map :


alors autant utiliser un Iterator!!!!
methode iterator() de l'interface collection...
puis hasNext() dans le for() et next() pour passer d'un element a l'autre

Jerome
Yvon Thoraval (18/02/2004, 16h22)
jerome moliere <jmoliere> wrote:

> alors autant utiliser un Iterator!!!!
> methode iterator() de l'interface collection...
> puis hasNext() dans le for() et next() pour passer d'un element a l'autre


oui, oui, j'ai vu ça, je pense aussi avoir un pb au remplissage...

.... parce que ma HashMap a pour valeurs, quelque soit la clé, la
dernière valeur de l'ArrayList "cols" donc ça veut dire que ce n'est pas
la valeur de cols qui est passée mais sa référence dans ma boucle de
lecture de sql :

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);
tableMap.put((String) t,(ArrayList) cols);
}
System.out.println("tableMap = " + tableMap);

nb : l'ArrayList tables contient la liste des tables.
dbmd vient pour DatabaseMetaData
nioTo (18/02/2004, 16h24)
Le 18/02/2004 14:02, Yvon Thoraval a &eacute;crit :
> je remplis une HashMap avec comme clés les noms des tables d'une bdd et
> comme valeur la liste des noms des colonnes pour une clé donnée :
> remplissage :
> tableMap.put((String) t,(ArrayList) cols);
> avec, par ex t = "t_mesure_msr"
> et cols obtenu par :
> cols.clear();
> cols.add(col);
> col étant une (String) du genre "msr_id";


Vérifie tous tes appels à cols.clear(),
si tu ne changes de référence pour l'objet cols, tu auras la même
pour chaque valeur dans ta map, et le clear la purge.

nioTo
Yvon Thoraval (18/02/2004, 17h22)
nioTo <nioto+news> wrote:

> Vérifie tous tes appels à cols.clear(),
> si tu ne changes de référence pour l'objet cols, tu auras la même
> pour chaque valeur dans ta map, et le clear la purge.


oui, c'est bien le pb que je rencontre, ça veut dire que ce n'est pas la
valeur de l'ArrayList cols qui est passée à HashMap mais la réréfence
donc, je dois faire un truc du genre :

cols_[i] = cols

et (HashMap) tableMap.put(t, col[i]); sinon toutes les valeurs , qqsoit
la clé, de ma HashMap prennent la dernière valeur de cols...
Christophe M (18/02/2004, 17h35)
Voir correction ci-dessous

Yvon Thoraval wrote:
> je remplis une HashMap avec comme clés les noms des tables d'une bdd et
> comme valeur la liste des noms des colonnes pour une clé donnée :
> remplissage :
> tableMap.put((String) t,(ArrayList) cols);
> avec, par ex t = "t_mesure_msr"
> et cols obtenu par : Dans le remplissage de tablemap :


cols = new ArrayList();
// cols.clear(); Pas besoin puisque c'est un nouveau

> cols.add(col);
> col étant une (String) du genre "msr_id";
> bien sûr j'ai vérifié au remplissage que cols.size() est non nulle
> Mais quand je veux itérer sur la Hash Map :
> for (int i = 0; i < tables.size(); i++) {
> t = (String) tables.get(i);
> System.out.println(" " + t);


// Ici le clear vide cols, donc la liste des champs de la table
// cols.clear(); Pas besoin

> cols = (ArrayList) tableMap.get((String) t);
> for (int j = 0; j < cols.size(); j++) {
> col = (String) cols.get(j);
> System.out.println(" " + col);
> }
> }


> cols.size() est tjs à 0, je pense que ce qui ne va pas, c'est le
> "tableMap.get((String) t)" et donc très vraisemblablement le
> tableMap.put((String) t,(ArrayList) cols);


Normal vu qu'il met tjrs la même référence dans tablemap, et qu'avant
l'affichage tu fais un clear()

> car il est spécifié que la clé est un objet ???


Oui, mais comme une String est un objet, y a pas de souci :-)
Yvon Thoraval (18/02/2004, 18h10)
Christophe M <mccricri_at_hotmail.com> wrote:

> cols = new ArrayList();


ok, merci, j'ai pigé avec ce new Arra(); je "force" le changement de
réf.

maintenant ca marche impec.

mais bon, je continue à lire la doc °;=)

j'ai découvert, entre temps, que j'aurais du utilisé HashSet (éléments
uniques) plutôt que HashMap...
Discussions similaires