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

Résolu
javabienetvous -  
 Ramo -
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   Statut Membre Dernière intervention   399
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
 
Super, ça fonctionne parfaitement maintenant.

Merci Doctor C, je vais pouvoir avancer dans mon projet.
0
javabienetvous
 
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   Statut Membre Dernière intervention  
 
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
Ramo
 
Merci à vous deux j'avais le même problème et ça m'a aidé ^^
0