1

在 Android 中编码时,我需要一个 ArrayList of Points,我称之为 wormPt。我通过循环初始化它。

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 应该报告点数 (220,300) (215,300) (210,300) (205,300) (200,300) (195,300)

相反,我所有的分数都是 (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和其他人,但他们似乎没有同样的问题。任何帮助将不胜感激。提前致谢。

4

4 回答 4

5

问题是您包含对同一对象ArrayList的多个引用。您在循环中所做的只是添加相同的引用并改变对象。

如果您更改循环以在每次迭代中创建一个 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 个不同的人一张写有您的家庭住址的纸。如果其中一个人访问该地址并将前门涂成绿色,然后另一个人访问该地址,他们将看到一个绿色的前门。

于 2012-12-01T07:58:11.413 回答
1

new Point每次添加时都必须创建ArrayList。相反,只有一个Point坐标在变化。

于 2012-12-01T07:58:39.613 回答
0

这很简单。您正在将相同的对象添加到列表中......

您应该在循环的每次迭代中创建一个新对象,然后将其添加到列表中。

尝试类似:

wormPt.add(new Point(x, 300));
于 2012-12-01T08:04:34.357 回答
0

该声明

wormPt.add(pt);

导致将相同的对象添加到 ArrayList 中。

您需要将不同的对象添加Point到arraylist。

为此,您可以使用
new Point(x, y)

也可以创建一个对象,例如
Point p = new Point(x,y)

然后将其添加到数组列表中。

于 2012-12-01T08:27:55.923 回答