Java 如何使用递归在Vaadin中获取子树项?

Java 如何使用递归在Vaadin中获取子树项?,java,recursion,vaadin,Java,Recursion,Vaadin,我试图在单击父项时获取Vaadin树的子项。我试图通过创建一个单独的方法来遍历树来使用递归,但是我被卡住了。这就是我到目前为止所做的: public Collection<?> recursiveTreeSearch(Object objectItemID, Collection<?> siblings){ if (evoltWebUI.getPrimaryTreeView().hasChildren(objectItemID)==true){

我试图在单击父项时获取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;
};  
公共集合递归树搜索(对象objectItemID,集合同级){
if(evoltWebUI.getPrimaryTreeView().hasChildren(objectItemID)==true){
兄弟姐妹=evoltWebUI.getPrimaryTreeView().getChildren(objectItemID);
for(int i=0;i

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

您可能正在尝试获取所有的decentant(子树的节点),而不仅仅是它的子节点。只需getChildren()就可以得到这些孩子。查看术语

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

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;
    };  
公共集合递归树搜索(对象objectItemID,集合同级){
if(evoltWebUI.getPrimaryTreeView().hasChildren(objectItemID)==true){
//这里您也遇到了一个问题,因为您的线路实际上没有对呼叫方可见的内容
addAll(evoltWebUI.getPrimaryTreeView().getChildren(objectItemID));
for(int i=0;i
这不应产生无限循环并返回所需结果。像这样使用它:recursiveTreeSearch(itemId,newarraylist())

要使该方法看起来更好、效率更高,应将子对象提取到局部变量,使用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;
        };  
public集合getsubstands(最终对象itemId){
返回getDegenantsRec(itemId,newArrayList());
}
私有集合GetDegenantsRec(最终对象itemId,最终集合同级){
Collection childrenIds=evoltWebUI.getPrimaryTreeView().getchildrenids(itemId);
if(childrenIds.size()>0){
兄弟姐妹。addAll(childrenIds);
for(对象childItemId:ChildrenId){
GetGenderantsRec(childItemId,兄弟姐妹);
}
} 
返回兄弟姐妹;
};  

希望这有帮助。

您可能正在尝试获取所有的decentant(子树的节点),而不仅仅是它的子节点。只需getChildren()就可以得到这些孩子。查看术语

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

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;
    };  
公共集合递归树搜索(对象objectItemID,集合同级){
if(evoltWebUI.getPrimaryTreeView().hasChildren(objectItemID)==true){
//这里您也遇到了一个问题,因为您的线路实际上没有对呼叫方可见的内容
addAll(evoltWebUI.getPrimaryTreeView().getChildren(objectItemID));
for(int i=0;i
这不应产生无限循环并返回所需结果。像这样使用它:recursiveTreeSearch(itemId,newarraylist())

要使该方法看起来更好、效率更高,应将子对象提取到局部变量,使用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;
        };  
public集合getsubstands(最终对象itemId){
返回getDegenantsRec(itemId,newArrayList());
}
私有集合GetDegenantsRec(最终对象itemId,最终集合同级){
Collection childrenIds=evoltWebUI.getPrimaryTreeView().getchildrenids(itemId);
if(childrenIds.size()>0){
兄弟姐妹。addAll(childrenIds);
for(对象childItemId:ChildrenId){
GetGenderantsRec(childItemId,兄弟姐妹);
}
} 
返回兄弟姐妹;
};  

希望这能有所帮助。

我认为,如果不进行测试,那是因为您永远不会减少树的同级数量……因此,您的方法总是使用相同的参数调用,并且永远不会结束。我认为evoltWebUI永远不会更改/交换,因此您最终会在对象上反复出现。如果它有子对象,它将总是重复出现。这是您需要进行的测试,如前所述,使evoltWebUI成为参数。测试当前子项是否有子项,然后recurse@efekctive-我应该将其作为第三个参数吗?是的,但为什么要传递参数?我还没有彻底研究代码,但我认为如果不进行测试,它可能是多余的,因为你永远不会减少树的同级数量……因此你的方法总是用相同的参数调用,永远不会结束。我认为evoltWebUI永远不会更改/交换,所以你最终会在对象上递归。如果它有子对象,它将总是重复出现。这是您需要进行的测试,如前所述,使evoltWebUI成为参数。测试当前子项是否有子项,然后recurse@efekctive-我应该将其作为第三个参数吗?是的,但为什么要传递参数?我还没有仔细看过代码,但它可能是额外的,这有助于使递归对我更清晰。然而,我在“兄弟姐妹.添加所有(childrenIds);”上得到一个错误,它是d