Contents

突破嵌套循环

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语句取代。

**当我们执行上面的代码时,我们得到与标记中断相同的结果。**请注意,要使此策略起作用,我们通常需要将循环块移动到它自己的方法中。