如何退出两个嵌套循环?

44

我一直在使用Java,但是我的循环教育有些不足。我知道如何创建Java中的每个循环,并且也知道如何跳出循环。然而,最近我思考了这个问题:

假设我有两个嵌套循环。我能否只用一个break语句同时跳出这两个循环?

以下是我目前拥有的内容。

int points = 0;
int goal = 100;
while (goal <= 100) {
    for (int i = 0; i < goal; i++) {
        if (points > 50) {
           break; // For loop ends, but the while loop does not
        }
        // I know I could put a 'break' statement here and end
        // the while loop, but I want to do it using just
        // one 'break' statement.
        points += i;
    }
}

有没有一种方法可以实现这个?

6个回答

86
在Java中,你可以使用标签来指定要中断/继续的循环:

在Java中,您可以使用标签来指定要中断/继续的循环:

mainLoop:
while (goal <= 100) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         break mainLoop;
      }
      points += i;
   }
}

1
@Grzegorz 我确实怀念过去可以使用goto而不被人指责的好日子;) - zw324
2
只要代码清楚地表达了发生的事情(目标接近于跳转),那么它就是好的,而且我认为更加简洁。 - ratchet freak
2
http://xkcd.com/292/,也就是说,PHP允许你写下"break 2;",但在我看来,Java版本更加简洁和可维护。 - sirbrialliance
2
是的,尽管我通常更喜欢将内部循环封装在额外的函数中,因为那通常更清晰,但使用goto肯定比使用额外的布尔变量并设置它更清晰。 - Voo
1
我简直不敢相信我之前不知道这个!非常感谢你的新课程! - Kyle
显示剩余2条评论

20

是的,你可以使用标签 break with label,例如:

int points = 0;
int goal = 100;
someLabel:
while (goal <= 100) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         break someLabel;
      }
   points += i;
   }
}
// you are going here after break someLabel;

6

有很多方法可以解决这个问题。这里介绍一种:

int points = 0;
int goal = 100;
boolean finished = false;
while (goal <= 100 && !finished) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         finished = true;
         break;
      }
   points += i;
   }
}

更新:哇,我不知道标签的断点。这似乎是更好的解决方案。

谢谢!我希望我能接受所有的答案! - fireshadow52
很酷。不过你的回答确实有道理。 :) - fireshadow52

1

初级的,亲爱的华生...

int points = 0;
int goal = 100;

while (goal <= 100) {
  for (int i = 0; i < goal; i++) {
    if (points > 50) {
      goal++;
      break;
    }
  points += i;
  }
}

或者

int points = 0;
int goalim = goal = 100;

while (goal <= goalim) {
  for (int i = 0; i < goal; i++) {
    if (points > 50) {
      goal = goalim + 1;
      break;
    }
  points += i;
  }
}

0

您可以重置循环控制变量。

int points = 0;
int goal = 100;
while (goal <= 100) {
   for (int i = 0; i < goal; i++) {
      if (points > 50) {
         i = goal = 101;
      }
   points += i;
   }
}

0

你不应该在客观语言中使用标签。

你需要重新编写for/while条件。

所以你的代码应该像这样:

int points = 0;
int goal = 100;
while (goal <= 100 && points <= 50) {
    for (int i = 0; i < goal && points <= 50; i++) {
        points += i;
    }
}

// Now 'points' is 55

这并不是真正回答问题,更像是一条评论。 - rghome
该帖子已更新,附有示例代码。 - Kacper Obrzut
“客观语言”是什么意思?是指 Objective-C 吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接