[JAVA] Probleme ajout element dans ArrayList

Résolu/Fermé
koko - 17 mars 2009 à 18:01
 SAM16 - 25 mai 2016 à 23:17
Bonjour à tous,

J'ai un petit soucis avec une arraylist de tableau d'entier.
Lorsque j'essaie d'y ajouter un élément dans la arrayList, l'element est bien ajouté mais écrase aussi les autres élément déjà dans dedans.

Voici un petit bout de code et son execution pour mieu comprendre :
private static ArrayList<Integer []> liste = new ArrayList<Integer[]>();

/***** du code *****/

public static void test (Integer[] d){
    	System.out.println("element recu");
    	for (int i=0; i<10; i++)
		System.out.print(d[i]+" ");
	System.out.println("");
    	
    	liste.add(d);
    	
    	System.out.println("contenu liste");
    	for (int j=0; j<rememberDigit.size(); j++){
		for (int i=0; i<10; i++)
			System.out.print(liste.get(j)[i]+" ");
		System.out.println("");
	}

    	System.out.println("taille = " + test.size());
    	System.out.println("");
}


- Résultat d'execution (j'appelle test 3 fois, a chaque fois je veux ajouter l'element que je lui donne en parametre dans la arrayList) :

element recu
116 125 171 255 255 150 93 0 0 0
contenu liste
116 125 171 255 255 150 93 0 0 0
taille = 1

element recu
169 253 253 253 253 253 253 218 30 0
contenu liste
169 253 253 253 253 253 253 218 30 0
169 253 253 253 253 253 253 218 30 0
taille = 2

element recu
38 254 109 0 0 0 0 0 0 0
contenu liste
38 254 109 0 0 0 0 0 0 0
38 254 109 0 0 0 0 0 0 0
38 254 109 0 0 0 0 0 0 0
taille = 3




j'ai aussi essayé :
liste.add(liste.size(), d);
a la place de
liste.add(d);

mais même résultat !

Est-ce que quelqu'un a une idée de la provenance du probleme?

Merci d'avance.
A voir également:

2 réponses

Salut,

C'est normal : tu inclues trois fois le même tableau dans ton arrayList (l'ajout d'un tableau dans un arraylist ne copie pas ledit tableau...)
0
Tout d'abord merci de ta réponse.

Mais je pige pas tout, comment ça j'ajoute 3 fois le même tableau? puisque à chaque fois d est différent...
Sinon comment faire alors pour pouvoir ajouter à la suite de la arrayList un nouvel élément?

Merci d'avance.
0
en ajoutant ton element fais un clone
MaArrayList.add(MonElement.clone);
0
SAM16 > oub's
25 mai 2016 à 23:17
merci beaucoup :)
0
merci
0
Salut,

N'oublie pas qu'en Java, un tableau est un objet et que donc une variable tableau désigne une référence à cet objet.
Je suppose que dans ton programme principal, tu créées un tableau, en modifie les cases, l'ajoute à ton ArrayList, remodifies ton tableau initial, le re-ajoute, etc...
C'est là que ça ne va pas : c'est le même tableau que désigne ta variable et la première case de ton arrayList.
Il faut donc qut tu crées un nouveau tableau à chaque fois que tu veux ajouter quelque chose à ton arrayList.
0
Merciiiiiiiiiiii tout fonctionne impec'

ralallalala C quand tu me tient...
0
jovialisation
18 déc. 2009 à 18:35
Bonjour à tous,

Voilà, j'ai le même type de problème et je ne comprends pas trop pourquoi.

En fait, je programme l'algo A* en java et j'ai une méthode pour trouver les cases (noeud) suivantes dans mon terrain. Voici le code:

//Méthode de calcul des noeuds successeurs
public static void findSuccessors(Node n, String[][] tab){
int x=n.getX();
int y=n.getY();

int u=(x+1);
int r=y;
if (!GetTerrain.tab[u][r].equals(one)){
Node a=new Node(u,r);
//System.out.println(a);
successors.add(a);
System.out.println(successors);
}

int v=x;
int w=(y-1);
if (!GetTerrain.tab[v][w].equals(one)){
Node b=new Node(v,w);
//System.out.println(b);
successors.add(b);
System.out.println(successors);
}

int z=(x-1);
int t=y;
if (!GetTerrain.tab[z][t].equals(one)){
Node c=new Node(z,t);
successors.add(c);
System.out.println(successors);
}

int e=x;
int c=(y+1);
if (!GetTerrain.tab[e][c].equals(one)){

Node d=new Node(e,c);
successors.add(d);
System.out.println(successors);
}

Le problème est que lorsqu'il ajoute le nouveau noeud successeur, il écrase les suivants.
Un exemple sera plus parlant: je pars du noeud qui a pour coordonnées (4,3)
premier successeur (5,3) --> ma liste "successors" contient [(5,3)]
deuxième successeurs (3,3) --> ma liste "successors" contient desormais [(4,3);(4,3)]
troisième successeurs (4,2) --> ma liste "successors" contient desormais [(4,2);(4,2);(4,2)]
qutrième successeurs (4,4) --> ma liste "successors" contient desormais [(4,4);(4,4);(4,4);(4,4)]

Ce problème a pour conséquence que mon algo boucle a l'infini sauf si par hasard le derner noeud trouvé est le noeud à atteindre.

Je précise aussi que c'est mon premier code en java... Si vous avez besoin de plus de précision n'hésitez pas.

Merci pour votre aide.
0