我有问题让我的ArrayList正确添加。当我在for循环完成后打印ArrayList时,ArrayList的长度是正确的,但是每个元素都是相同的(创建的最后一个Coordinate)。
有人可以修复(并解释)下面的代码吗?
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());
}
}
}
提前感谢您的帮助!
答案 0 :(得分:10)
而不是
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);
}
你应该
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);
}
这样,arrayList将保存许多对象而不是只有一个对象。 ArrayList中的所有元素都指向同一个对象,这是导致问题的原因。
答案 1 :(得分:4)
你必须这样做:
Coordinate newCoord;
for(int i = 0; i < 96; i++)
{
newCoord = new Coordinate(0,0);
...
因为在您的情况下,您每次都要设置相同的对象(newCoord)。
答案 2 :(得分:2)
这是因为您每次在循环中添加相同的坐标对象。你需要为循环的每次迭代创建新的坐标对象。
答案 3 :(得分:2)
这里的问题是你永远不会创建你的Coorddinates的新实例。所以每次你修改newCoord你修改同一个实例。 Arraylist不会复制该对象,它只是将其引用存储在列表中,这意味着如果您不创建新实例,则始终添加相同的
试试这个
协调新协议;
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());
}
答案 4 :(得分:2)
在上面的代码中,您每次都添加相同的实例。您只创建了一个实例,并一次又一次地添加它直到循环迭代。
因此,每次将一个新的Coordinate类实例放入列表中。它会给你不同的打印结果。
如同其他解决方案所示。 希望这会对你有所帮助。
答案 5 :(得分:0)
每次迭代,您都会重新添加Coordinate
的同一个实例。然后,您重置该实例上的值。在循环结束时,您有96个索引指向同一个对象,该索引已在每次迭代时更新。
答案 6 :(得分:0)
这是因为作为“Coordinate”类属性的X和Y是静态属性,因此对象在内存中有一个副本。所有实例都指向相同的地址。你不应该使用“static”关键字,这样他们就可以使用自己的副本并拥有不同的值。