ArrayList(java) renvoi que le dernier element

Fermé
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010 - 16 mars 2010 à 17:59
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010 - 17 mars 2010 à 11:10
Bonjour,
Ça fait un moment que je parcours les conseils de ce forum, et malgré toutes les réponses que j'ai pu lire aucune n'a pu faire fonctionner mon programme.

Mon programme scanne une fichier .txt pour récupérer des informations à des endroits précis. Avec ces informations, je créé des objets pour les contenir. Jusque là, tout va bien. Afin de stocker et de pouvoir facilement accéder à ces objets, j'ai créé un ArrayList, vu que je ne peux savoir à l'avance combien d'objet seront créés par chaque fichier lu. Puis j'ai essayé d'afficher ces objets, de manière à vérifier que le tableau était bien créé.

C'est là que ça se gatte : Ayant lu la documentation Java sur les ArrayList, j'en suis arrivé à un petit algorithme tout simple, placé après la boucle de lecture du fichier :

for (int j=0;j<Tab.size();j++)
{
Tab.get(j).ecrireCDS();
}

ecrireCDS est ma fonction qui écrit les objets, et je peux vous assurer qu'elle marche très bien. Le problème est que le résultat de cet algorithme ne me donne que le dernier objet rentré dans mon ArrayList (Ici, Tab). Un compteur en static dans la fonction ecrireCDS me confirme cependant que le programme y passe bien un nombre de fois égal au nombre d'objets dans mon tableau. De plus, un affichage de type Tab.get(i).ecrireCDS au moment où l'objet est rajouté dans la liste me confirme que chaque objet est bien rentré.

J'ai essayé toute une batterie de test sur les différentes variables, dont je vous passerai tout les détails. J'ai essayé d'afficher la taille de ma liste, et elle a toujours été cohérente avec ce qu'elle était censée être. J'ai essayé de faire un bête println sur le Tab.get(j) dans la seconde boucle, et les identifiants des objets qui en sortaient a l'écran étaient tous differents.
J'ai de plus essayé de récupérer une syntaxe utilisant des iterator (bien que n'ayant pas exactement comprit comment ça fonctionnait...), mais toujours le même problème : seul le dernier objet de la liste était affiché.

Donc voilà. Je ne sais pas si le problème vient de ma fonction ecrireCDS, qui pourtant marchait très bien avant cela, ou si je fais une mauvaise utilisation des ArrayList, ou si c'est la combinaison des deux qui fait que ça ne fonctionne pas.
A voir également:

9 réponses

artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
16 mars 2010 à 18:08
un arraylist se parcours avec un itérator...
Iterator it=new ta_list.iterator();
while(it.hasNext()){
//pour retourner un élément, tu utilises it.next();
}
1
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010
16 mars 2010 à 18:18
Tu es sûr de ta syntaxe ? Eclipse me dit qu'il ne reconnait pas Tab (que j'ai mit à la place de ta_list dans ton exemple)
J'avais déjà vu une syntaxe similaire : Iterator it= Tab.iterator(); (sans le "new", donc) Ceci dit, même avec cette "nouvelle" syntaxe (je l'avais déjà essayée), le résultat reste le même : seul le dernier élément est affiché.
0
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
16 mars 2010 à 18:44
tu as bien mis
ArrayList<type d'objet dedant> Tab=new ArrayList<type d'objet dedans>();
puis
Iterator it= Tab.iterator();

il faut bien sur faire au tout départ import java.util.Iterator;
ps j'ai plus ou moins le même problème que toi, de mets dse objets Jpanel dans un arrayList, chaque JPanel étant sensé dessiner un rectangle, seul le premier et le dernier le font, bizarre n'est-ce pas.
0
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010
16 mars 2010 à 19:37
Oui, c'est bien ce que j'ai fait. Enfin, plus exactement :
Iterator<CDS> it= Tab.iterator();
(CDS étant le type des mes objets. C'est aussi avec ça que j'ai appelé mon ArrayList)
0
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
16 mars 2010 à 19:39
pas besoin de mettre l'identificateur sur l'Iterator d'ailleur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010
16 mars 2010 à 19:41
Quand je ne le fais pas, Eclipse m'engueule et refuse de lancer le programme : il dit que la fonction "ecrireCDS" que j'utilise après sur mon iterator est pas sûre de fonctionner, vu qu'on est pas sûr que l'iterator soit un objet de type CDS... Donc si ça change rien, j'aime autant le mettre.
0
artragis Messages postés 481 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 6 avril 2010 146
16 mars 2010 à 20:13
il faut le caster, c'est pour ça.
quand tu utilises next();
tu mets avant (CDS)it.next).ta_fonction();
0
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010
16 mars 2010 à 20:53
J'avais déjà testé ça aussi... Et toujours sans succès. En même temps, si c'était un problème de cast, on ne pourrait même pas passer dans ecrireCDS
Comme la ligne (CDS)it.next).ta_fonction(); ne marchait pas, j'ai écrit ça :
CDS SS = (CDS)it.next();
SS.ecrireCDS();
0
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010
17 mars 2010 à 10:38
Bon, j'ai essayé autre chose : J'ai "return"é mon tableau dans la classe qui prend en compte le clic sur le bouton. Là encore, quel que soit la syntaxe que j'utilise, c'est toujours le dernier élément qui est affiché. Je ne sais pas si ça apporte des indices, mais bon...
Personne n'a même une idée d'où le problème pourrait venir ? Si y'a des test a faire, je les fais volontiers.
0
Guntyr Messages postés 8 Date d'inscription mardi 16 mars 2010 Statut Membre Dernière intervention 19 août 2010
17 mars 2010 à 11:10
RAAAAAAAAAAAAAAAAAAAAAH !!!
J'ai trouvé ! Je SAVAIS que le problème venait de ma fonction ecrireCDS ! J'avais tout simplement déclaré les variable locale en static (je sais plus trop pourquoi, d'ailleurs...) ! Donc forcement, elles bougeaient pas quand j'appelais la fonction !
Désolé, donc... J'aurais apprit plein de choses, mais je doute que ce topic soit intéressant à l'avenir. Merci pour ton aide, Artragis !
(Hop, une petite musique d'ambiance (9 secondes) pour clore le sujet : https://www.youtube.com/watch?v=tLtPrLtaRNo )
0