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);
}

您不需要三个嵌套循环,因为您只分配给一个数组。

顺便说一句,您的数组索引不应该rects从 0 开始吗​​?

于 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 个值,因此只有一个循环。您可以使用模运算符来获取适当的值。

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

您正在循环遍历所有jk每个值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

我在您的代码中看到了几个可能会给您带来问题的问题:

  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 回答
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 回答