突破嵌套循环
1. 概述
在本教程中,我们将创建一些示例来展示在循环中使用break 的不同方法。接下来,我们还将了解如何在完全不使用break 的情况下终止循环。
2. 问题
嵌套循环非常有用,例如,在列表的列表中进行搜索。
一个例子是学生列表,其中每个学生都有一份计划课程列表。假设我们要查找计划课程 0的人的姓名。
首先,我们将遍历学生列表。然后,在该循环内,我们将遍历计划课程列表。
当我们打印学生和课程的名字时,我们会得到以下结果:
student 0
course 0
course 1
student 1
course 0
course 1
我们想找到第一个计划course 0的学生。但是,如果我们只使用循环,那么应用程序将在找到课程后继续搜索。 在我们找到计划特定课程的人后,**我们想停止搜索。**继续搜索将花费更多的时间和资源,而我们不需要额外的信息。这就是我们要跳出嵌套循环的原因。
3. 休息
我们必须走出嵌套循环的第一个选择是简单地使用break语句:
String result = "";
for (int outerCounter = 0; outerCounter < 2; outerCounter++) {
result += "outer" + outerCounter;
for (int innerCounter = 0; innerCounter < 2; innerCounter++) {
result += "inner" + innerCounter;
if (innerCounter == 0) {
break;
}
}
}
return result;
我们有一个外循环和一个内循环,两个循环都有两次迭代。如果内循环的计数器等于 0,我们将执行break命令。当我们运行该示例时,它将显示以下结果:
outer0inner0outer1inner0
或者我们可以调整代码以使其更具可读性:
outer 0
inner 0
outer 1
inner 0
这是我们想要的吗?
几乎,内层循环**在找到 0 后被break 语句终止。然而,外层循环继续,**这不是我们想要的。我们希望在得到答案后立即完全停止处理。
4. break
前面的例子是朝着正确方向迈出的一步,但我们需要稍微改进一下。我们可以通过使用标记的 break来做到这一点:
String result = "";
myBreakLabel:
for (int outerCounter = 0; outerCounter < 2; outerCounter++) {
result += "outer" + outerCounter;
for (int innerCounter = 0; innerCounter < 2; innerCounter++) {
result += "inner" + innerCounter;
if (innerCounter == 0) {
break myBreakLabel;
}
}
}
return result;
**带标签的break 将终止外循环,而不仅仅是内循环。**我们通过在循环外添加myBreakLabel并将 break 语句更改为停止myBreakLabel来实现这一点。运行示例后,我们得到以下结果:
outer0inner0
我们可以通过一些格式更好地阅读它:
outer 0
inner 0
如果我们查看结果,我们可以看到**内循环和外循环都终止了,**这正是我们想要实现的。
5. return
作为替代方案,我们也可以使用return语句在找到结果时直接返回结果:
String result = "";
for (int outerCounter = 0; outerCounter < 2; outerCounter++) {
result += "outer" + outerCounter;
for (int innerCounter = 0; innerCounter < 2; innerCounter++) {
result += "inner" + innerCounter;
if (innerCounter == 0) {
return result;
}
}
}
return "failed";
标签被移除,break语句被return语句取代。
**当我们执行上面的代码时,我们得到与标记中断相同的结果。**请注意,要使此策略起作用,我们通常需要将循环块移动到它自己的方法中。