我在点击父级时尝试获取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;
};
这最终成为一个无限循环。有什么建议吗?
答案 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;
};
希望这有帮助。