Probleme Java ArrayList
Michal
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
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
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:
- Probleme Java ArrayList
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
18 réponses
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?
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?
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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:
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
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
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
Exact normalement c'est ça:
Et tu dis que ça marche pas? Qu'est ce qu'il dit?
Jeu tmp = (Jeu) j.clone();
Et tu dis que ça marche pas? Qu'est ce qu'il dit?
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
Mais je pense que je vais changer de méthode
merci de m'avoir aider en tt k
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()).
Tu crées un ArrayList<String> est dedans tu mets l'affichage du jeu en chaine de caractère (grâce à toString()).
Essaye comme suit:
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.
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.
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] ]]
[[ [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] ]]