【问题标题】:Java recursion not iterating all top level elementsJava递归不迭代所有顶级元素
【发布时间】:2018-06-01 15:36:09
【问题描述】:

我遇到了递归问题。我有一个包含自身列表的对象,列表中的每个对象都可以包含一个列表本身。这个对象代表一棵树。

现在我想迭代所有可能的对象以找到 1 个特定对象,但我失败了。目前我的方法没有返回到顶层,我不知道如何修复它。

方法:

private Object selectSpecificItem(TreeObject treeObject) {
    for (TreeObject to : treeObject.getChildren()) {
        Object data = to.getData();
        if (data instanceof PaymentOffice) {
            PaymentOffice po = (PaymentOffice) data;
            if (po.getCode().equals(getModelObject().getLocation())) {
                return to;
            }
        } else if (to.getChildren().length > 0) {
            selectSpecificItem(to);
        }
    }
    return null;
}

假设以下列表结构:

Item1
    - Item1.1
    - Item1.2
    - Item1.3
    - Item1.4
Item2
Item3

现在它遍历所有 1/1.x 项,但不是 2/3。我现在需要找到的项目是Item3

如何更改递归以迭代所有元素?

【问题讨论】:

  • 您可能想在 else if 中将 selectSpecificItem(to); 更改为 return selectSpecificItem(to);
  • @Lino 我也试过了,但没有任何改变
  • 您是否有任何根 TreeObject 可以容纳 Item1、Item2。 Item3 作为它的子项?
  • @NisheshPratap 是的,它作为第一次调用传入
  • 好吧,你没有迭代其他 2 个项目,因为在第一个项目中你已经返回了一些东西

标签: java recursion


【解决方案1】:

您忽略了递归调用返回的值。您应该检查递归调用是否返回了非null 值,如果返回,则返回。

private Object selectSpecificItem(TreeObject treeObject) {
    Object result = null;
    for (TreeObject to : treeObject.getChildren()) {
        Object data = to.getData();
        if (data instanceof PaymentOffice) {
            PaymentOffice po = (PaymentOffice) data;
            if (po.getCode().equals(getModelObject().getLocation())) {
                return to;
            }
        } else if (to.getChildren().length > 0) {
            result = selectSpecificItem(to);
            if (result != null) {
                return result;
            }
        }
    }
    return result;
}

有些人喜欢在方法的末尾有一个return 语句。如果你是这样的人,你可以这样写:

private Object selectSpecificItem(TreeObject treeObject) {
    Object result = null;
    for (TreeObject to : treeObject.getChildren()) {
        Object data = to.getData();
        if (data instanceof PaymentOffice) {
            PaymentOffice po = (PaymentOffice) data;
            if (po.getCode().equals(getModelObject().getLocation())) {
                result = to;
                break;
            }
        } else if (to.getChildren().length > 0) {
            result = selectSpecificItem(to);
            if (result != null) {
                break;
            }
        }
    }
    return result;
}

【讨论】:

  • 你也可以 break 退出 for 循环,而不是在 else if 中返回 result,这将是相同的
  • @Lino 这是真的
  • 非常感谢。它现在确实返回了正确的元素
猜你喜欢
  • 1970-01-01
  • 2013-06-26
  • 2023-02-22
  • 2012-08-29
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多