Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多级菜单结构_Java_Tree_Navigation - Fatal编程技术网

Java多级菜单结构

Java多级菜单结构,java,tree,navigation,Java,Tree,Navigation,我正在用Java(Tapestry 5)构建一个web应用程序。 我想创建一个多级菜单,在这里我可以显示根元素,例如在我的页面顶部,在左侧显示所选元素的子元素 为了实现这一点,我考虑使用如下树结构: public class SiteMap { private List<MenuItem> root; public class MenuItem { private String pageFileName; private String pageNavigatio

我正在用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;
    }
}
}
公共类站点地图{
私有列表根;
公共类菜单项{
私有字符串页面文件名;
私有字符串pageNavigationName;
私人名单儿童;
私有菜单项父项;
公共菜单项(字符串pageFileName、字符串pageNavigationName、菜单项父项){
this.pageFileName=页面文件名;
this.pageNavigationName=pageNavigationName;
this.parent=parent;
}
公共字符串getPageFileName(){
返回页面文件名;
}
公共字符串getPageNavigationName(){
返回pageNavigationName;
}
公共列表getChildren(){
返回儿童;
}
公共菜单项getParent(){
将此文件返回给父对象;
}
}
}
现在,如果我想基于树中某个父项的子项(只有pageFileName-String)构建一个菜单,该怎么办。我必须递归遍历树才能根据pageFileName(字符串)找到父项,这似乎不是一个好方法

这(使用树结构)是实现这一点的正确方法吗?还是有更好的选择? 任何想法和提示都将不胜感激

提前谢谢


Nathan

为什么不为父母和子女使用MenuItem,并保留每个子女对其父母的引用

List<MenuItem> children; // empty/null for leaf nodes
MenuItem parent; // null for root nodes
列出子项;//叶节点为空/空
菜单项父项;//根节点为null

这样做没有错,代码运行速度非常快,特别是因为你不会有数百万个菜单项。

是的,很抱歉应该是这样(我的错)。但是,在我的Web应用程序中构建菜单时,我必须根据父页面文件名(字符串)查找子菜单。因此,我必须在树中循环查找父项,我猜?我按照我的意思更新了我的代码,很抱歉造成混淆。(与旧代码混淆)嘿,谢谢你的回答。这里的问题是,我没有将“curr”作为MenuItem数据类型,而是作为字符串(页面文件的名称)。因此,我必须递归地(?)在树中搜索具有此pageFileName的正确父级。好吧,我误解了,也许只是添加一个HashMap以快速查找。
MenuItem root = null;
MenuItem curr = myMenuItem;
while(curr.getParent() != null) {
    curr = curr.getParent(); 
}
root = curr;