【问题标题】:Java multilevel menu structureJava多级菜单结构
【发布时间】: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) 找到这个父项,这似乎不是一个好方法。

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

提前致谢!

内森

【问题讨论】:

    标签: java tree navigation


    【解决方案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) 找到子级。所以我必须遍历树才能找到我猜的这个父项?
    • 我按照我的意思更新了我的代码,很抱歉造成混淆。 (与旧代码混淆)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多