2010-11-12 12 views
2

J'ai des problèmes pour ajouter correctement ma ArrayList. Lorsque j'imprime ArrayList après la fin de la boucle for, ArrayList a la longueur correcte, mais chaque élément est le même (la dernière coordonnée créée).Problème avec ArrayList dans Java

Quelqu'un peut-il corriger (et expliquer) le code ci-dessous?

public class test { 

private static ArrayList<Coordinate> mOrigCoords; 
private static ArrayList<Coordinate> mNewCoords; 
private static int mListSize; 
private static int mPixelsX; 

public static void main(String[] args) 
{ 

    mOrigCoords = new ArrayList<Coordinate>(); 
    mNewCoords = new ArrayList<Coordinate>(); 

    mPixelsX = 480; 

    int j = 0; 

    Coordinate newCoord = new Coordinate(0,0); 

    for(int i = 0; i < 96; i++) 
    { 
     j = j + 5; 

     newCoord.setX(j); 
     newCoord.setY((int)(Math.random()*300)); 

     mOrigCoords.add(newCoord); 
    } 

    mListSize = mOrigCoords.size(); 

    for(int n = 0; n < mListSize; n++) 
    { 
     System.out.println("test " + mOrigCoords.get(n).toString()); 
    } 

} 
} 

Merci d'avance pour l'aide!

Répondre

9

Au lieu de

Coordinate newCoord = new Coordinate(0,0); 

    for(int i = 0; i < 96; i++) 
    { 
     j = j + 5; 

     newCoord.setX(j); 
     newCoord.setY((int)(Math.random()*300)); 

     mOrigCoords.add(newCoord); 
    } 

vous devriez avoir

Coordinate newCoord = null; 

for(int i = 0; i < 96; i++) 
{ 
    newCoord = new Coordinate(0,0); 
    j = j + 5; 

    newCoord.setX(j); 
    newCoord.setY((int)(Math.random()*300)); 

    mOrigCoords.add(newCoord); 
} 

De cette façon, le arrayList tiendra plusieurs objets au lieu d'un seul. Tous les éléments de votre ArrayList pointent vers le même objet, qui était la cause de problèmes. Votre problème ici est que vous ne créez jamais de nouvelles instances de vos coordonnées.

+0

Merci! Je ne m'en suis pas rendu compte! Merci pour le code + explication. (la plupart des autres réponses sont correctes, mais la vôtre a eu le plus d'effort!) – developer

+0

Je suis heureux de pouvoir aider –

2

C'est parce que vous ajoutez le même objet de coordonnées à chaque fois dans votre boucle. vous devez créer de nouveaux objets de coordonnées pour chaque itération de la boucle.

4

que vous devez faire comme ceci:

Coordinate newCoord; 
for(int i = 0; i < 96; i++) 
    { 
    newCoord = new Coordinate(0,0); 
    ... 

Parce que dans votre cas, vous définissez le même objet (newCoord) à chaque fois.

0

A chaque itération, vous ajoutez à nouveau la même instance de votre Coordinate. Vous réinitialisez ensuite les valeurs sur cette instance. À la fin de votre boucle, vous avez 96 index pointant vers le même objet, qui a été mis à jour à chaque itération.

2

Donc, chaque fois que vous modifiez newCoord, vous modifiez la même instance. Arraylist ne fait pas une copie de l'objet, il a juste stocke sa référence dans la liste, ce qui signifie que si vous ne créez pas une nouvelle instance, votre ajoutant toujours le même

essayer cette

Coordonnée newCoord ;

for(int i = 0; i < 96; i++) 
{ 
    j = j + 5; 

    //newCoord.setX(j); 
    //newCoord.setY((int)(Math.random()*300)); 

    mOrigCoords.add(new Coordinate(j,(int)(Math.random()*300))); 
} 

mListSize = mOrigCoords.size(); 

for(int n = 0; n < mListSize; n++) 
{ 
    System.out.println("test " + mOrigCoords.get(n).toString()); 
} 
2

Dans le code ci-dessus vous ajoutez la même instance tous les time.You ont créé une seule instance et en ajoutant encore et encore jusqu'à ce que l'itération de la boucle.

Alors faites une nouvelle instance de la classe Coordinate à chaque fois pour la mettre dans la liste. Elle vous donnera un résultat d'impression différent.

Comme dans l'autre solution, il est montré. J'espère que cela vous aidera.

0

C'est parce que X et Y, qui sont des propriétés de la classe "Coordinate", sont des propriétés statiques, donc les objets en ont une copie en mémoire. Toutes les instances pointent la même adresse. Vous ne devriez pas utiliser le mot-clé "static" pour pouvoir utiliser votre propre copie et avoir des valeurs différentes.