2011-08-18 66 views
2

我正在用Java构建一个Web应用程序(Tapestry 5)。 我想创建一个多级菜单,我可以在页面顶部显示根元素,并在左侧显示选定的子元素。Java多级菜单结构

要实现这一点,我想用一个树状结构是这样的:

public class SiteMap { 

private List<MenuItem> root; 

public class MenuItem { 

    private String pageFileName; 
    private String pageNavigationName; 

    private List<MenuItem> children; 
    private MenuItem parent; 

    public MenuItem(String pageFileName, String pageNavigationName, MenuItem parent) { 
     this.pageFileName = pageFileName; 
     this.pageNavigationName = pageNavigationName; 
     this.parent = parent; 
    } 

    public String getPageFileName() { 
     return pageFileName; 
    } 

    public String getPageNavigationName() { 
     return pageNavigationName; 
    } 

    public List<MenuItem> getChildren() { 
     return children; 
    } 

    public MenuItem getParent() { 
     return this.parent; 
    } 
} 
} 

现在,如果我想根据1个父项的儿童(只有在pageFileName - 字符串),以建立一个菜单在树的某个地方。我必须通过树遍历遍历才能找到基于pageFileName(String)的父项,这似乎不是一个好方法。

这是(使用树结构)正确的方式来实现这个?还是有更好的选择? 任何想法和提示都表示赞赏!

在此先感谢!

弥敦道

回答

0
MenuItem root = null; 
MenuItem curr = myMenuItem; 
while(curr.getParent() != null) { 
    curr = curr.getParent(); 
} 
root = curr; 

有什么不妥做这样的说法,该代码将运行速度非常快,especailly因为你不会有上百万的菜单项。

+0

嘿谢谢你的回答。 这里的问题是,我没有“curr”作为MenuItem数据类型,而只是作为一个String(页面文件的名称)。所以我不得不递归(?)用这个pageFileName在树上搜索正确的父节点。 –

+0

好吧,我误解了,也许只是添加一个HashMap 快速查找。 –

+0

好的,我会尝试 谢谢 –

0

为什么不使用菜单项在父和儿童,并保持每个孩子的引用其父?

List<MenuItem> children; // empty/null for leaf nodes 
MenuItem parent; // null for root nodes 
+0

是的,我很抱歉,它应该是这样(我的错)。 但是当在我的web应用程序中构建菜单时,我不得不根据父母页面文件名(字符串)找到孩子。所以我将不得不通过树循环找到这个父项我猜? –

+0

我更新了我的代码,因为我的意思是,对于混淆抱歉。 (与旧代码混淆) –