Java多级菜单结构

Posted

技术标签:

【中文标题】Java多级菜单结构【英文标题】:Java multilevel menu structure 【发布时间】:2011-10-29 17:00:19 【问题描述】:

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

为了实现这一点,我想使用这样的树结构:

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 - String)构建一个菜单,该怎么办。我必须递归遍历树才能根据 pageFileName (String) 找到这个父项,这似乎不是一个好方法。

这是(使用树形结构)实现它的正确方法吗?还是有更好的选择? 感谢任何想法和提示!

提前致谢!

内森

【问题讨论】:

【参考方案1】:
MenuItem root = null;
MenuItem curr = myMenuItem;
while(curr.getParent() != null) 
    curr = curr.getParent(); 

root = curr;

这样做并没有错,代码会运行得非常快,尤其是因为您不会有数百万个菜单条目。

【讨论】:

您好,感谢您的回答。这里的问题是,我没有“curr”作为 MenuItem 数据类型,而只是作为字符串(页面文件的名称)。所以我必须递归地(?)使用这个 pageFileName 在树中搜索正确的父级。 好吧,我理解错了,也许只是添加一个 HashMap 以便快速查找。【参考方案2】:

为什么不对父项和子项都使用 MenuItem 并保留每个子项对其父项的引用?

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

【讨论】:

是的,很抱歉应该是这样(我的错)。但是在我的 web 应用程序中构建菜单时,我必须根据父 pageFileName (String) 找到子级。所以我必须遍历树才能找到我猜的这个父项? 我按照我的意思更新了我的代码,很抱歉造成混淆。 (与旧代码混淆)

以上是关于Java多级菜单结构的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中生成菜单树结构常用方法总结

JAVA中生成菜单树结构常用方法总结

JAVA中生成菜单树结构常用方法总结

JAVA代码实现多级树结构封装对象

iOS 动态树形结构 - 实现多级菜单,附带复选框功能

简单几步,快速实现封装多级树结构对象(Java版)