Utilisation d'une ArrayListe avec des classes

Résolu
mau007 Messages postés 20 Date d'inscription lundi 2 janvier 2006 Statut Membre Dernière intervention 20 mai 2011 - 26 avril 2011 à 22:42
 Utilisateur anonyme - 2 mai 2011 à 19:00
Bonjour à tous,


étant débutant dans la programmation java, je fais appel à une communauté d'amis .

Mon soucis concerne l'utilisation d'une ArrayList... Voici en détail ce que je rencontre comme problème.

J'ai une classe "MyClass":

public class MyClass
  {
  String champUn;
  String champDeux;
  String champTrois;
  }


Dans ma fonction "main", voici ce que j'ai:

public static void main(String[] args)
  {
  List <MyClass> maClasse = new ArrayList <MyClass>();
  MyClass currentClass = new MyClass();

  currentClass.champUn = "Test1_Champ1";
  currentClass.champDeux = "Test1_Champ2";
  currentClass.champTrois = "Test1_Champ3";
  maClasse.add(currentClass);

  currentClass.champUn = "Test2_Champ1";
  currentClass.champDeux = "Test2_Champ2";
  currentClass.champTrois = "Test2_Champ3";
  maClasse.add(currentClass);

  System.out.println("maClasse.size(): " + maClasse.size());
  System.out.println("maClasse.get(0).champUn: " + maClasse.get(0).champUn);
  System.out.println("maClasse.get(1).champUn: " + maClasse.get(1).champUn);
  }


Avec ce code, je m'attendais au résultat suivant:

maClasse.size(): 2
maClasse.get(0).champUn: Test1_Champ1
maClasse.get(1).champUn: Test2_Champ1

Or, ce n'est pas du tout ce que j'obtiens. Voici le vrai résultat obtenu (c'est la dernière ligne qui change):

maClasse.size(): 2
maClasse.get(0).champUn: Test1_Champ1
maClasse.get(1).champUn: Test1_Champ1


Est-ce que quelqu'un peut m'expliquer la raison?
Ai-je oublié de faire quelque chose?
Comment puis-je m'en sortir vu que je souhaite obtenir un "tableau" de classe (un truc genre :

MyClass[] maClasse;
...


mais on m'a conseillé l'utilisation d'une ArrayList...

Merci de m'aiguiller vers la bonne réponse :)

6 réponses

HFanny Messages postés 699 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 13 mai 2011 20
27 avril 2011 à 03:40
Salut,

Tout d'abord, ce que tu devrais obtenir est :
maClasse.size(): 2
maClasse.get(0).champUn: Test2_Champ1
maClasse.get(1).champUn: Test2_Champ1

Ce qui se passe :
1. currentClass est créé
2. la référence à currentClass est ajouté à maClasse
3. currentClass est modifié
4. la référence à currentClass est ajouté à nouveau à maClasse

La méthode .add ajoute la référence d'un objet à la fin de la liste, il faut donc créer un nouvel objet et non pas réutiliser le précédent.

  MyClass currentClass = new MyClass();
  currentClass.champUn = "Test1_Champ1";
  currentClass.champDeux = "Test1_Champ2";
  currentClass.champTrois = "Test1_Champ3";
  maClasse.add(currentClass);

  currentClass = new MyClass(); //nouvel objet
  currentClass.champUn = "Test2_Champ1";
  currentClass.champDeux = "Test2_Champ2";
  currentClass.champTrois = "Test2_Champ3";
  maClasse.add(currentClass);



Par contre, je ne sais pas si c'est parce que c'est un test mais il est en général préféré d'avoir des attributs d'un objet "private" et d'utiliser des getters et setters pour y accéder :)
(Et pour le nom de la classe ainsi que le mix entre anglais/français pour les noms des champs, je suppose que c'est aussi dû au test ^^)

Fanny
3
Utilisateur anonyme
27 avril 2011 à 16:12
Voila c'est ca =)

Un getter te permet d'acceder a un attribut par exemple, et ceci avec une methode getMonAttribut().
Un setter te permet de donner une valeur a un attribut, et ce grace a une methode du genre setMonAttribut( Type nomParam ).

Il n'est jamais trop tard pour apprendre auelaue chose

Bonne continuation !


-- Pylouq : jongleur de clavier AZERTY et de clavier QWERTZ --
3
mau007 Messages postés 20 Date d'inscription lundi 2 janvier 2006 Statut Membre Dernière intervention 20 mai 2011
27 avril 2011 à 10:49
Un grand merci pour l'info Fanny.
Je viens de tester cela et effectivement, cela fonctionne beaucoup mieux.

Pour la typographie, je vais faire un effort .

Mon niveau de connaissance de java n'est pas très élevé et j'apprends un peu sur le tas (et sur le tard aussi)

Encore un grand merci pour cet aide

une dernière question (de débutant) juste pour la "forme"
getter = methode get
setter = methode set
c'est ca?
0
mau007 Messages postés 20 Date d'inscription lundi 2 janvier 2006 Statut Membre Dernière intervention 20 mai 2011
27 avril 2011 à 22:09
Merci Pylouq pour les éclaircissements.
Je vois ce que je dois faire. Je vais essayer de paufiner mon application :)
0

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

Posez votre question
mau007 Messages postés 20 Date d'inscription lundi 2 janvier 2006 Statut Membre Dernière intervention 20 mai 2011
1 mai 2011 à 13:30
Bonjour à tous,

je me permet de ré-ouvrir ce post car au fil des jours mes connaissances augmentent et mon projet progresse avec tout un lot de questions. Mais il y en a une que je n'arrive pas trouver une réponse... Alors... A vous le studio :-)

Class ClasseUne extends ClassAbstraite{
  private String champUn;
  private String champDeux;
  private List <ClasseDeux> champTrois = new ArrayList <ClassDeux>();

  //getter / setter pour chaque attribut
}


Le souci que je rencontre est que "champTrois" doit contenir tant des objets de type ClasseDeux que des objets de type ClasseTrois.

Comment puis-je faire cela?

Merci d'avance.

M.
0
Utilisateur anonyme
2 mai 2011 à 19:00
Si tu mets tout ça dans une même liste, il faudrait que tes classes ClasseDeux et ClasseTrois héritent de la même classe (ex : SuperClasse) que tu utiliseras.

Ce qui te donnera quelque chose du genre
private List<SuperClasse> champsTrois = new ArrayList<ClasseDeux>();



-- Pylouq : jongleur de clavier AZERTY et de clavier QWERTZ --
0
Rejoignez-nous