【问题标题】:Using recursion and breaking a for loop使用递归并打破 for 循环
【发布时间】:2014-08-22 14:08:15
【问题描述】:

我有这个代码

public void getItems(Node node) {
  if (!isFound) {
    NodeList list = node.getChildNodes();
    outer:
    for (int i = 0; i < list.getLength(); i++) {
      Node childNode = list.item(i);
      if (node.getNodeName().equals("test")) {
        for (int size=0; size<node.getChildNodes().getLength(); size++) {
          //Some code here
        }
        isFound = true;
        break outer;
      }
      getItems(childNode);
    }
  }
}

当它执行“break outer”时,它会跳出外部 for 循环。哪个好。但是外部的for循环在爆发后继续再次启动。为什么会这样?

My isFound 是一个实例变量,设置为 false。

【问题讨论】:

  • 但是当一个简单的休息可以在这里的时候为什么你这样做呢?
  • 您可能正在查看getItems 方法的递归调用之一的执行情况。
  • 那是因为你在递归调用方法!
  • 您不会在使 if 语句为真的节点上调用 getItems(),但已经进行的其他调用将继续运行。
  • 对不起,我粘贴了错误的代码。现在更新了 OP

标签: java


【解决方案1】:

回答您最初的问题:代码继续,因为带标签的 break 不会将控制流“转移”到标签,而是转移到紧跟在带标签的语句之后的语句。让我用一棵树来说明(我的 ASCII 艺术不是很好,但请耐心等待……)

- Item1
+- Subitem1
 +- Sub1Subitem1
 +- Sub1Subitem2 >==|
 +- Sub1Subitem3    | break outer;
+- Subitem2 <=======|
 +- Sub2Subitem1
...
- Item N

现在,如果您在 Sub1Subitem2 上进行休息,您将摆脱对子节点集合 (Sub1Subitem#) 的遍历,将您弹出一个 SINGLE 级别,这应该意味着您最终会到达 SubItem2,绕过 Sub1Subitem3,因为您突破了一层,但仍在运行,因为您递归了不止一层。

如果您试图完全摆脱循环(这意味着如果您在 Sub1Subitem2 中找到答案,根据示例,您已经完成并且不需要再做)您需要突破所有级别,而不是只有一个。另一个StackOverflow answer 提出了这样做的建议。

【讨论】:

    【解决方案2】:

    1) 简单的解决方案:

    for (int i = 0; i < list.getLength() && !isFound; i++) {
    

    2) 另一个更好的解决方案是不使用“break”。只需将方法从“void”修改为“boolean”,返回boolean结果,不要使用全局变量“isFound”。

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 2021-03-11
      • 2013-01-31
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多