有条件的for循环或许多for循环吗?

时间:2018-01-17 11:35:00

标签: java for-loop conditional

我试图让我的代码以不同的for in for循环方式工作,但我不知道我是否应该让条件进入循环内部或者只是为了增强创建多个for循环速度。

我的英语在解释事情时看起来效率很低,所以这里有一个例子:

for (int i = 1; i < 31; i++) {
    if (i < 11) {
        System.out.println(3*i);
    } else if (i<21) {
        System.out.println(2*i);
    } else System.out.println(i);
}

for (int i = 1; i < 11; i++) System.out.println(3*i);
for (int i = 11; i < 21; i++) System.out.println(2*i);
for (int i = 21; i < 31; i++) System.out.println(i);

如果其中一个可能更好或更好的原因也可以解释,那将会非常有帮助。提前谢谢:&gt;

5 个答案:

答案 0 :(得分:3)

提高速度不应该是一个考虑因素。差异(如果有的话)可以忽略不计。

您应该选择更易读的版本。使用for循环时,通常意味着您希望执行相同的操作N次。在您的情况下,您希望执行3个不同的操作,每个操作的次数不同(或i的不同值)。因此,有3个循环更有意义。

for (int i = 1; i < 11; i++) {
    System.out.println(3*i);
}
for (int i = 11; i < 21; i++) {
    System.out.println(2*i);
}
for (int i = 21; i < 31; i++) {
    System.out.println(i);
}

答案 1 :(得分:2)

第一个单循环分析: -  变量初始化1。  比较次数: -

  1. 1&lt; 31

  2. 1&lt; 11

  3. 2&lt; 31

  4. 2&lt; 11 等等。

  5. 因此对于1到10个比较数字20。

    为11到20的比较数30。 对于21到30的比较数量30。

    单个循环的总 80比较。 但是

    for (int i = 1; i < 11; i++) System.out.println(3*i);
    for (int i = 11; i < 21; i++) System.out.println(2*i);
    for (int i = 21; i < 31; i++) System.out.println(i);
    

    总比较31。

    所以单独的循环是好的,而不是if else ledder。

答案 2 :(得分:1)

使代码可读更重要。性能差异非常小,在大多数情况下可以忽略。这是我计算机上的实验结果:

模式1:

  • 运行100000次,花费7548毫秒
  • 运行1000000次,耗费70180毫秒

模式2:

  • 运行100000次,费用为7536毫秒
  • 运行1000000次,费用为70535毫秒

答案 3 :(得分:0)

除非出于性能考虑,否则可读性会引导您。 第二个肯定更容易理解。虽然我建议使用块语句:

for (int i = 1; i < 11; i++) {
    System.out.println(3*i);
}
for (int i = 11; i < 21; i++) {
    System.out.println(2*i);
}
for (int i = 21; i < 31; i++) {
    System.out.println(i);
}

当然你可以制定一个公式:

for (int i = 1; i < 31; i++) {
    int fac=3-((i-1)/10);
    System.out.println(fac*i);
}

虽然这似乎也是不可读的,但如果等效的是许多for - 循环或许多循环,那么它可能是最好的方法,你无法在编译时确定。

答案 4 :(得分:0)

3 for循环更快(这里不重要),因为在每个i步都不再有if-else-if。更重要的是,三个循环更具可读性,因为删除了if cascade。

但是使用j = i + 1第一个循环可以转换为:

final int n = 30;
for (int j = 0; j < n; j++) {
    int k = n/10 - j/10;
    System.out.println(k * (j + 1));
}

由于分裂,这可能不会更快。然而,删除if-cascade是一种改进。这些表达式在阅读时难以解释,但它们指定了一些计算逻辑,仅仅说明条件不会:一个可以用300改变30但仍然一切都有意义。

或者

for (int j = 0; j < 3; ++j) {
    for (int i = 1 + j*10; i < 11 + j*10; i++) {
        System.out.println((3-j)*i);
    }
}