Probleme Java ArrayList

Fermé
Michal - 7 avril 2008 à 10:40
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 7 avril 2008 à 22:09
Bonjour, j'ai un petit probleme qui me bloque! En fait je dois réaliser l'histrique d'un jeu de maniere a pouvoir retourner en arriere si le coup joué n'est pas bon.
J'ai donc stocké dans une ArrayList chaque tour de jeu.
Le probleme, c'est que quand j'affiche ce qu'il y a dans le jeu, il stocke la bonne valeur mais me modifie les autres valeurs déjà stockées dans l'ArrayList auparavant.

Mon code :

public void miseAJourHistorique (Jeu j) {
listeJeu.add(indexHistorique, j);
for (int i=0;i<=indexHistorique;i++) {
System.out.println("table actuelle" + listeJeu.get(i).getTable().toString());
}
/* si plus de huit "tours" de jeu, on écrase les premiers */
if (indexHistorique >= 7)
indexHistorique = 0;
else
indexHistorique ++;

if (((indexHistorique - dernierIndexUndo) >= 3)&&(exception))
exception = false;

System.out.println("mise a jour historique effecuée. index = " + indexHistorique);

}

Et il me renvoie :
table actuelle : [ [0|4] ]
mise a jour historique effecuée. index = 1
table actuelle : [ [0|4] , [4|2] ]
table actuelle : [ [0|4] , [4|2] ]
mise a jour historique effecuée. index = 2
table actuelle : [ [0|4] , [4|2] , [2|5] ]
table actuelle : [ [0|4] , [4|2] , [2|5] ]
table actuelle : [ [0|4] , [4|2] , [2|5] ]

Donc voila je comprends pas pourquoi tout s'efface. Si qqun pouvait m'aider...
Merci d'avance
A voir également:

18 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 13:41
Parce que je pense que tu utilises toujours le même objet j de type Jeu.
Imagine: tu as j avec [0|4]
Tu l'insères dans ton arrayList à l'index 0.

Plus tard tu ajoutes [4|2] dans ton j et tu l'insères dans ton ArrayList à l'index 1. Le soucis ici c'est que comme tu sembles manipuler toujours le même objet de type Jeu, l'index 0 et l'index 1 de ton arrayList pointeront sur le même objet j. Et donc tu afficheras toujours le même jeu.
Si tu veux un historique, il faudrait que tu fasses une copie de ton jeu qui arrive dans miseAJourHistorique

Tu me suis?
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 13:27
Salut,

Ben tout à l'air d'aller bien, je vois pas en quoi tout s'efface...
0
moi non + je comprends pas.

Je voudrais en fait que ca m'affiche :
[ [0|4] ]
[ [0|4] , [4|2] ]
[ [0|4] , [4|2] , [2|5] ]

et ca maffiche
[ [0|4] , [4|2] , [2|5] ]
[ [0|4] , [4|2] , [2|5] ]
[ [0|4] , [4|2] , [2|5] ]

...
merci de maider en tt k
0
je viens de lire ton message. Je vais voir, je vais tester ta solution je verrai bien, mais c'est vrai que c peut etre ca. Simpa en tt cas de ta réponse
0

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

Posez votre question
comment puis je faire une copie de mon jeu?
0
ca marche toujours pas!
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 19:36
Ben pour faire une copie ça dépend de ton objet.
Même si c'est un pu dangereux tu peux essayer de faire ça:
Jeu tmp = j.clone(); //sachant que j est le Jeu à copier
0
j.clone() ne marche pas, pck Jeu n'est pas une arrayList
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 19:41
clone est un méthode que tout objet Java possède.
0
je suis desole mais ca marche pas
ca me mets une erreur en me disant soit de mettre Jeu tmp = (Jeu) j.clone();
soit Object tmp = j.clone();

mais dans les deux cas, ca ne marche pas non plus.
c ptetre ma declaration de jeu ki va pas
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 19:53
Exact normalement c'est ça:
Jeu tmp = (Jeu) j.clone(); 

Et tu dis que ça marche pas? Qu'est ce qu'il dit?
0
Il me dit
"rename in file (CTRL+2, R direct access)"
0
mais j'ai beau cliquer, rien n'y fait

Mais je pense que je vais changer de méthode
merci de m'avoir aider en tt k
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 20:10
Autre méthode: pourquoi ne pas stocker sous forme de chaine de caractère?
Tu crées un ArrayList<String> est dedans tu mets l'affichage du jeu en chaine de caractère (grâce à toString()).
0
pck dans ma classe Jeu je ne veux pas que le string, jai aussi la main des joueurs, le score, .....
0
Essaye comme suit:

ArrayList<Jeu> listeJeu=new ArrayList<Jeu>();

public void miseAJourJeu (Jeu j) {
   listeJeu.add(j); 
   System.out.println(listeJeu); 
   // methode toString() dans Jeu obligatoire. (sinon retourne l'objet coter memoire)
   // affiche tout les elements de la liste sous forme [ obj1 ; obj2 ; ... ]

   if (listeJeu.size() >= 8) // pour les 8 derniers tours. 
      listeJeu.remove(0); // supprime le 1er element de la liste.
} 


le problème ne vient pas d'un duplicata du meme jeu car il l'appelle en methode.

sinon pour ton index arrayList a les fonctions pour le faire automatiquement et donc compile le code en quelques lignes ^^
a mon avis c'est dans les index que tu doit te planter quelque part.
0
j'ai testé, ca marche pas non plus, ca me mets toujours :


[[ [2|5] ]]
[[ [1|2] , [2|5] ], [ [1|2] , [2|5] ]]
[[ [0|1] , [1|2] , [2|5] ], [ [0|1] , [1|2] , [2|5] ], [ [0|1] , [1|2] , [2|5] ]]
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
7 avril 2008 à 22:09
le problème ne vient pas d'un duplicata du meme jeu car il l'appelle en methode.

Quand tu passes un objet en paramètre d'un méthode, il s'agit toujours du même objet... Le passage se fait par référence et non par copie, d'ou le problème d'effet de bord ici je pense.
0