Java递归无法迭代所有顶层元素

3

我在递归方面遇到了问题。我有一个对象,它包含一个自身的列表,列表中的每个对象都可以再次包含一个列表。这个对象表示一棵树。

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

方法:

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
@Lino 我已经尝试过了,但是没有任何改变。 - XtremeBaumer
@NisheshPratap 是的,它作为第一个调用传递。 - XtremeBaumer
你从未检查treeObject是否持有一个PaymentOffice,只是它的子节点。 - Tibrogargan
@Tibrogargan 因为我知道我将其作为父级传递,并且根节点没有任何数据。 - XtremeBaumer
显示剩余3条评论
1个回答

6

您忽略了递归调用返回的值。您应该检查递归调用是否返回非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;
}

你也可以在for循环中使用break语句来代替在else if中返回result,这样做是等价的。 - Lino
@Lino,没错。 - Eran
非常感谢。现在它确实返回了正确的元素。 - XtremeBaumer

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