在Android中进行编码时,我需要一个我称之为wormPt的PointsList。我通过循环初始化它。
ArrayList<Point> wormPt = new ArrayList<Point>();
Point pt = new Point();
.
.
.
private void initializeWorm() {
// TODO Auto-generated method stub
pt.x = 220;
pt.y = 300;
for (int i = 0; i <= 5; i++) {
wormPt.add(pt);
Log.d("wormdebug", wormPt.toString());
pt.x -= 5;
}
Log.d("wormdebug", wormPt.toString());
}
我的上一次log.d应报告点数 (220300) (215300) (210300) (205300) (200,300) (195300)
相反,我的所有观点都是(190,300)
这是我的日志数据
11-21 23:48:11.549: D/wormdebug(3273): [Point(220, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(215, 300), Point(215, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(210, 300), Point(210, 300), Point(210, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(205, 300), Point(205, 300), Point(205, 300), Point(205, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(200, 300), Point(200, 300), Point(200, 300), Point(200, 300), Point(200, 300)]
11-21 23:48:11.600: D/wormdebug(3273): [Point(195, 300), Point(195, 300), Point(195, 300), Point(195, 300), Point(195, 300), Point(195, 300)]
11-21 23:48:11.630: D/wormdebug(3273): [Point(190, 300), Point(190, 300), Point(190, 300), Point(190, 300), Point(190, 300), Point(190, 300)]
11-21 23:48:14.669: W/KeyCharacterMap(3273): No keyboard for id 0
11-21 23:48:14.679: W/KeyCharacterMap(3273): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
我试过了 Can't add element to ArrayList in for loop和其他人,但他们似乎没有同样的问题。任何帮助将不胜感激。 提前谢谢。
答案 0 :(得分:5)
问题是您的ArrayList
包含对同一对象的多个引用。你在循环中所做的就是添加相同的引用并改变对象。
如果您更改循环以在每次迭代时创建 new Point
,它将起作用:
int x = 220;
for (int i = 0; i <= 5; i++) {
wormPt.add(new Point(x, 300));
x -= 5;
}
理解变量,对象和引用之间的区别非常重要。 pt
是一个变量。它的值是对Point
对象的引用。除非你要求一个新的对象,否则Java不会为你创建一个。例如:
Point a = new Point(10, 20);
Point b = a; // Copies the *reference*
a.x = 100;
System.out.println(b.x); // 100
请注意,这并不是将a和b 变量相互关联 - 它只是给它们相同的值(相同的参考)。因此,您可以稍后将a
更改为对其他Point
的引用,并且不会更改b
:
Point a = new Point(10, 20);
Point b = a; // Copies the *reference*
a.x = 100;
a = new Point(0, 0); // This doesn't affect b, or the object its value refers to
System.out.println(b.x); // 100
在这种情况下,它有点像给10个不同的人一张纸上的家庭住址。如果一个的人访问该地址并将前门涂成绿色,那么他们中的另一个访问该地址,他们将看到一个绿色的前门。
答案 1 :(得分:1)
每次添加到new Point
时,您都必须创建ArrayList
。相反,只有一个Point
具有不断变化的坐标。
答案 2 :(得分:0)
这很简单。您正在将相同的对象添加到列表...
你应该在循环的每次迭代中创建一个新对象,然后将其添加到列表中。
尝试类似:
wormPt.add(new Point(x, 300));
答案 3 :(得分:0)
声明
wormPt.add(pt);
导致将相同的对象添加到ArrayList中。
您需要将Point
的不同对象添加到arraylist中。
为此你可以使用
new Point(x, y)
或
你可以创建一个像对象的对象
Point p = new Point(x,y)
然后将其添加到arraylist。