for语句

uhry853o  于 2021-07-09  发布在  Java
关注(0)|答案(7)|浏览(238)

我正在研究一种改变代码长度的方法。
我有这个:

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

问题是后者不起作用,尽管它应该起作用。我的问题是,有什么问题?我试过很多方法来解决这个问题,但都不管用。我不得不用谷歌搜索这个问题,因为我不知道问题出在哪里。如果值得注意的话,这也是一个小程序的代码。

huus2vyu

huus2vyu1#

我想你想要这样的东西:

/**
  *  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 );
}
x0fgdtte

x0fgdtte2#

试着这样做:

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

而且,不,我不是一个优化编译器。

huwehgph

huwehgph3#

如果您稍微浏览一下您的代码,就会发现您的代码执行以下操作:

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 .

wnavrhmk

wnavrhmk4#

我发现代码中有几个问题可能会给您带来问题:
原始代码显示setlocation函数的第一个参数递增100,而for循环显示它递增50。我原来是你想要的。
整数i、j和k是在它们自己的局部范围内创建的。这意味着一旦您完成'k'for循环,k就会从内存中删除。为了避免这种情况,可以在原始for循环之外创建所有变量。
你不需要所有的嵌套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);
}
2ul0zpep

2ul0zpep5#

你在周旋 j 以及 k 每一个价值 i ,最终将所有位置设置为(500500)。
你应该做的是保持 j 以及 k 作为循环外的独立变量(可以调用它们 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;
    }
}
8tntrjer

8tntrjer6#

您正在执行最里面的语句241010=2400次。
您应该将其编写为单个循环,并将x和y值计算为序列。

m2xkgtsf

m2xkgtsf7#

循环应如下所示:

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开始?

相关问题