0

私はいくつかのコードの長さに変更する方法に取り組んでいました。

私はこれを持っていました:

    rects[1].setLocation(0, 0);
    rects[2].setLocation(100, 0);
    rects[3].setLocation(200, 0);
    rects[4].setLocation(300, 0);
    rects[5].setLocation(400, 0);
    rects[6].setLocation(500, 0);
    rects[7].setLocation(0, 50);
    rects[8].setLocation(100, 50);
    rects[9].setLocation(200, 50);
    rects[10].setLocation(300, 50);
    rects[11].setLocation(400, 50);
    rects[12].setLocation(500, 50);
    rects[13].setLocation(0, 100);
    rects[14].setLocation(100, 100);
    rects[15].setLocation(200, 100);
    rects[16].setLocation(300, 100);
    rects[17].setLocation(400, 100);
    rects[18].setLocation(500, 100);
    rects[19].setLocation(0, 150);
    rects[20].setLocation(100, 150);
    rects[21].setLocation(200, 150);
    rects[22].setLocation(300, 150);
    rects[23].setLocation(400, 150);
    rects[24].setLocation(500, 150);

そして私はそれをこれに変更しました:

    for(int i = 1; i < 25; i++)
    {
        for(int j = 0; j < 550; j +=50)
        {
            for(int k = 0; k < 550; k +=50)
            {
                rects[i].setLocation(j, k);
            }
        }
    }

問題は、後者は機能するはずですが、機能しないことです。私の質問は、何が問題なのかということです。問題を解決するために多くの方法を試しましたが、何も機能しません。問題が何であるかわからないので、私はこの質問をグーグルで検索する方法が必要です。注目に値する場合、これもアプレットからのコードです。

4

7 に答える 7

6

ループは次のようになります。

for (int i=0; i<24; i++) {
    int x = (i%6)*100;
    int y = (i/6)*50;
    //Array indexes start from 1, whereas this  
    //loop starts from 0, hence adjusting below
    rects[i+1].setLocation(x, y);
}

1つの配列にのみ割り当てるため、3つのネストされたループは必要ありません。

ちなみに、配列のインデックスはrects0から始めるべきではありませんか?

于 2012-08-25T03:20:56.370 に答える
3

最も内側のステートメントを24*10 * 10=2400回実行しています。

これを単一のループとして記述し、x値とy値をシーケンスとして計算する必要があります。

于 2012-08-25T03:20:51.877 に答える
2

コードを少しトレースすると、コードが次のことを実行していることがわかります。

rects[1].setLocation(0, 0);
rects[1].setLocation(0, 50);
rects[1].setLocation(0, 100);
rects[1].setLocation(0, 150);
...

これは明らかにあなたが望むものではありません。合計24個の値を設定するだけでよいため、ループは1つだけです。モジュロ演算子を使用して、適切な値を取得できます。

for(int i = 1; i < 25; i++)
{
    rects[i].setLocation(((i-1)%6)*100, ((i-1)/6)*50);
}

いくつかの説明:

モジュロ演算子の説明

うまくいく理由(i-1)/6は、これが整数除算であるためです。結果は整数に切り捨てられます。たとえば、11/6 = 1

于 2012-08-25T03:22:54.650 に答える
1

私はあなたがこのようなものが欲しいと思います:

/**  
  *  Do two things every 6th iteration:
  *
  *    1.) Reset j to zero
  *    2.) Increment k by 50
  *
  *  Otherwise increment j by 100 every iteration.
  *
  */

for (int i = 1; i < 25; i ++) {
    if (isMultipleOfSix(i)) {
        j = 0;
        k += 50;
    }
    rects[i].setLocation(j, k);
    j += 100;
}

private boolean isMultipleOfSix(int num) {
    return ( num % 6 == 0 );
}
于 2012-08-25T03:22:08.570 に答える
1

jのすべてのk値に対してループしているためi、すべての場所が(500、500)に設定されます。

あなたがすべきことは、ループの外で別々の変数として保持jk(おそらくそれらxを呼び出すy)、各ループでそれらを更新することです。

int x = 0;
int y = 0;
for(int i=0; i<25; i++) {
    rects[i].setLocation(x, y);
    if(x == 500) {
        x = 0;
        y += 50;
    } else {
        x += 100;
    }
}
于 2012-08-25T03:22:47.057 に答える
0

多分このようなことを試してください:

for (int i = 0, y = 0; i <= 24; y += 50) {
  for (int x = 0; x <= 500; x += 100) {
    locs[++i].setLocation(x, y);
  }
}

いいえ、私は最適化コンパイラではありません。

于 2012-08-25T03:59:01.090 に答える
0

コードに問題を引き起こしている可能性のあるいくつかの問題があります。

  1. 元のコードでは、setLocation関数の最初のパラメーターが100ずつ増加するように示されていますが、forループでは50ずつ増加するように示されています。私は元のパラメーターが必要です。
  2. 整数i、j、およびkは、独自のローカルスコープで作成されます。これは、'k' forループを終了するとすぐに、kがメモリから削除されることを意味します。これを回避するために、元のforループの外側にすべての変数を作成できます。
  3. ネストされたすべてのforループは必要ありません

これが私がすることです:

for(int i = 1, j = 0, k = 0; i < 24; j += 100) 
{
  if(j > 500)
  {
    j = 0;
  }

  if(i%6 == 0)
  {
    k += 50;
  }

  rects[i].setLocation(j, k);
}
于 2012-08-25T07:24:50.080 に答える