如何使用Recursion来获取Vaadin中的子树项?

时间:2017-01-12 16:38:53

标签: java recursion vaadin

我在点击父级时尝试获取Vaadin树的子项。我试图通过创建一个单独的方法来遍历树来使用递归,但我被卡住了。这就是我到目前为止所做的:

public Collection<?> recursiveTreeSearch(Object objectItemID, Collection<?> siblings){

    if (evoltWebUI.getPrimaryTreeView().hasChildren(objectItemID)==true){

        siblings = evoltWebUI.getPrimaryTreeView().getChildren(objectItemID);

        for (int i = 0; i < evoltWebUI.getPrimaryTreeView().getChildren(objectItemID).size(); i++) {

            recursiveTreeSearch(objectItemID, siblings); 
        }

    } 

    return siblings;
};  

这最终成为一个无限循环。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可能正在尝试获取所有后代(子树的节点),而不仅仅是其子节点。要让孩子们只需 getChildren()即可。查看https://en.wikipedia.org/wiki/Tree_(data_structure)#Terminology的术语。

问题是您使用相同的参数递归调用相同的方法。您的意思可能如下:

public Collection<?> recursiveTreeSearch(Object objectItemID, Collection<?> siblings){

        if (evoltWebUI.getPrimaryTreeView().hasChildren(objectItemID)==true){
            // here you had an issue as well, as your line in fact did nothing visible to the caller
            siblings.addAll(evoltWebUI.getPrimaryTreeView().getChildren(objectItemID));

            for (int i = 0; i < evoltWebUI.getPrimaryTreeView().getChildren(objectItemID).size(); i++) {
                // here was your bug:
                recursiveTreeSearch(evoltWebUI.getPrimaryTreeView().getChildren(objectItemID).get(i), siblings); 
            }
        } 

        return siblings;
    };  

这不应该产生无限循环并返回所需的结果。像这样使用它: recursiveTreeSearch(itemId,new ArrayList())

为了使方法看起来更好,效率更高,你应该将children对象提取到局部变量,使用foreach循环,更好地命名方法和参数:

    public Collection<?> getDescendants(final Object itemId) {
        return getDescendantsRec(itemId, new ArrayList<Object>());
    }

    private Collection<?> getDescendantsRec(final Object itemId, final Collection<Object> siblings) {

            Collection<?> childrenIds = evoltWebUI.getPrimaryTreeView().getChildren(itemId);

            if (childrenIds.size() > 0){
                siblings.addAll(childrenIds);

                for (Object childItemId : childrenIds) {
                    getDescendantsRec(childItemId, siblings); 
                }
            } 

            return siblings;
        };  

希望这有帮助。