1

Android でのコーディング中に、wormPt と呼ばれるポイントの ArrayList が必要でした。ループで初期化しました。

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 人に渡すようなものです。そのうちの 1 人がその住所を訪れて正面玄関を緑に塗り、別の人がその住所を訪れた場合、緑の正面玄関が表示されます。

于 2012-12-01T07:58:11.413 に答える
1

new Pointに追加するたびに作成する必要がありますArrayList。代わりにPoint、座標が変化するのは 1 つだけです。

于 2012-12-01T07:58:39.613 に答える
0

とてもシンプルです。同じオブジェクトをリストに追加しています...

ループの反復ごとに新しいオブジェクトを作成し、それをリストに追加する必要があります。

次のようなものを試してください:

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

声明

wormPt.add(pt);

同じオブジェクトが ArrayList に追加されます。

Pointarraylist に別のオブジェクトを追加する必要があります。

そのために使用する
new Point(x, y)
か、
次のようなオブジェクトを作成できます
Point p = new Point(x,y)

そしてそれをarraylistに追加します。

于 2012-12-01T08:27:55.923 に答える