Java - problème d'affichage d'un arraylist

Résolu/Fermé
javabienetvous - 8 déc. 2010 à 21:06
 Ramo - 1 mai 2014 à 13:26
Bonjour,

Je suis débutente en Java. J'ai un problème d'affichage d'une arraylist d'objets.
Je voudrais d'afficher le contenu d'un arraylist d'objets mais j'affiche toujours le même objet (le dernier).
Par exemple, si j'ajoute 2 objets différents, il m'affiche 2 fois le dernier ajouté. Pourquoi ?

Voici le code des 3 classes que j'utilise :
ListeCadeaux listeCadeaux = new ListeCadeaux();
Cadeau kdo1 = new Cadeau();
String nom = "";
String titre = "";
String url = "";
double prix = 0.0;
String description = "";
int reponse = 5;
int reponseMenu1 = 4;
int reponseMenu2 = 4;
int reponseMenu3 = 4;
char ajout = 'o';
String listAConsulter = "";
int numeroCadeau = 0;
int nbCadeaux = 0;

//tant qu'on veut ajouter des cadeaux
while (reponseMenu2 == 1){
System.out.println("");
System.out.println("Liste de cadeaux :");
listeCadeaux.afficherListeCadeaux();

System.out.println("");
System.out.println("Ajouter un cadeau :");
System.out.println("");
System.out.print("Nom du cadeau :");
titre = Clavier.lireString();

System.out.print("URL :");
url = Clavier.lireString();

System.out.print("Prix :");
prix = Clavier.lireDouble();

System.out.print("Description :");
description = Clavier.lireString();

kdo1.setTitre(titre);
kdo1.setUrl(url);
kdo1.setPrix(prix);
kdo1.setDescription(description);
listeCadeaux.ajouterCadeau(kdo1);

System.out.println("Voulez-vous ajouter un autre cadeau : (o/n)");
ajout = Character.toLowerCase(Clavier.lireCharLn());

if ( ajout == 'n'){
reponseMenu2 = 0;
}
}

...


Classe Cadeau :
public class Cadeau implements java.io.Serializable{

private String titre = "";
private String url = "";
private double prix = 0.00;
private String description = "";

public Cadeau() {
}

public Cadeau(String titre, String url, double prix, String description) {
this.titre = titre;
this.url = url;
this.prix = prix;
this.description = description;
}

public String getTitre() {
return this.titre;
}

public void setTitre(String _titre) {
this.titre=_titre;
}

public String getUrl() {
return this.url;
}

public void setUrl(String _url) {
this.url=_url;
}

public double getPrix() {
return this.prix;
}

public void setPrix(double _prix) {
this.prix=_prix;
}

public String getDescription() {
return this.description;
}

public void setDescription(String _description) {
this.description=_description;
}

public String toString(){
return this.titre + ", " + this.url + ", " + this.prix + ", " + this.description + ". ";
}

} // cadeau




Classe ListeCadeaux :
public class ListeCadeaux {

//Cadeau[] tabCadeau = new Cadeau[100] ;
//private Etudiant[] etudiants = new Etudiant[10];
private List<Cadeau> listeCadeau = new ArrayList<Cadeau>();
private int taille = 0;

// constructeur du panier
public ListeCadeaux(){
}

public void ajouterCadeau (Cadeau nouveauCadeau) {
listeCadeau.add(nouveauCadeau);
}

public int taille(){
taille=listeCadeau.size();
return taille;
}

public void afficherCadeaux(Cadeau nouveauCadeau){
System.out.println("Liste des cadeaux : ");
System.out.println("");
System.out.println("Titre : " + nouveauCadeau.getTitre());
System.out.println("URL : " + nouveauCadeau.getUrl());
System.out.println("Prix : " + nouveauCadeau.getPrix());
System.out.println("Description : " + nouveauCadeau.getDescription());
}

public void afficherListeCadeaux(){
Iterator i = listeCadeau.iterator();
while (i.hasNext()) {
System.out.println(i.next().toString() + "\t");
}
}


Merci pour votre aide.
A voir également:

6 réponses

Doctor C Messages postés 627 Date d'inscription mardi 12 juin 2007 Statut Membre Dernière intervention 19 février 2016 398
Modifié par Doctor C le 8/12/2010 à 22:21
J'ai juste jeté un coup d'oeil rapide mais selon moi, tu devrais placer cette ligne de code:

Cadeau kdo1 = new Cadeau(); 

dans ta boucle, directement avant ces lignes:

kdo1.setTitre(titre);   
kdo1.setUrl(url);   
kdo1.setPrix(prix);   
kdo1.setDescription(description);   
listeCadeaux.ajouterCadeau(kdo1); 


Selon ma compréhension des objects en java, tu ajoutais toujours le même cadeau (instancié au tout début de ton code) dans ta liste de cadeaux en changeant les informations de ce dernier à chaque tour de boucle. Sauf qu'en bout de ligne, il s'agissait toujours du même object que tu ajoutais dans ta liste de cadeaux ce qui explique pourquoi tu affichais toujours le même object avec ses dernières modifications.

Faire l'opération new dans ta boucle te permet de créer un nouvel object cadeau (une nouvelle instance de ta classe Cadeau) à chaque tour dans la boucle ce qui devrait éliminer ton problème selon moi.

Bonne chance!

Echo "Lima Mike Alfa";
2
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
8 déc. 2010 à 22:46
Je ne sais pas trop ce que dois faire Clavier (je te conseille la classe Scanner)
Mais j'ai peur que tu ajoutes toujours les mêmes objets...

Au moment où tu fais setTitre (idem pour les autres) tu modifies la valeur du String titre, donc ça modifie toutes les valeurs (qui est la même) de titre dans les différents objets Cadeau de la liste !
Donc forcément, c'est la dernière valeur qui est conservée !

Essayes ceci :

kdo1.setTitre(new String(titre));

// ou avec Scanner :

Scanner sc=new Scanner(System.in); // à initialiser au début

kdo1.setTitre(sc.nextLine());

sc.close(); // à fermer à la fin
0
javabienetvous
8 déc. 2010 à 22:56
Super, ça fonctionne parfaitement maintenant.

Merci Doctor C, je vais pouvoir avancer dans mon projet.
0
javabienetvous
8 déc. 2010 à 22:58
KX, merci pour ton aide.

Clavier est une classe imposée, je ne peux pas utiliser scanner.

C'était "Cadeau kdo1 = new Cadeau(); " qui devait être mis dans la boucle.
0

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

Posez votre question
ivalavi6 Messages postés 1 Date d'inscription jeudi 29 septembre 2011 Statut Membre Dernière intervention 29 septembre 2011
29 sept. 2011 à 20:55
je ne comprends pas excusez moi,
la partie
Cadeau kdo1 = new Cadeau();
kdo1.setTitre(titre);
kdo1.setUrl(url);
kdo1.setPrix(prix);
kdo1.setDescription(description);
listeCadeaux.ajouterCadeau(kdo1);
intervient a quel niveau du code? a quelle classe? cadeau ou liste cadeau?
0
Merci à vous deux j'avais le même problème et ça m'a aidé ^^
0