【问题标题】:(N)Multi Level menu datastructure for iteration in ui(N)用于ui中迭代的多级菜单数据结构
【发布时间】:2014-11-25 06:32:43
【问题描述】:

关于如何在java中处理n级菜单以及在ui中进一步迭代的问题。

以下是MENU

的数据库表数据

id menu_name parent_id
1 主 1 空
2 银行 1 1
3 测试1 2
4 测试2 2
5 测试3 2
6 银行 2 1
7 测试4 6
8 测试5 6
9 测试6 6

Class Menu 用作 Menu 表的模型

public class Menu {

    private int id;

    private String menuName;

    private int parentId;
}

从数据库中取出的数据存放在ArrayList<Menu>

问题是如何表示从数据库中检索的 n 级菜单作为 java 对象或数据结构,这将捕获 n 级菜单和简单的 ui 迭代并显示多级菜单导航列表。

代码需要对所有级别都通用,并且应该轻松地合并所有级别

【问题讨论】:

    标签: java database data-structures collections


    【解决方案1】:

    这里的问题应该分为两部分:构建菜单和访问菜单。结果菜单实际上是有向无环图或树。每个菜单项都是此树中的节点:

    package my.menu;
    import java.util.LinkedList;
    
    public class MenuNode{
        private MenuNode parent;
        private LinkedList<MenuNode> children;
    
        private String name;
        private int id;
    
        public MenuNode(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public int getId() {
            return id;
        }
    
        public MenuNode getParent() {
            return parent;
        }
    
        public void setParent(MenuNode parent) {
            this.parent = parent;
        }
    
        public void addChild(MenuNode child) {
            children.add(child);
            child.setParent(this);
        }
    
        public LinkedList<MenuNode> getChildren() {
            return children;
        }
    }
    

    1.建筑菜单

    你有一些来自数据库的列表,你应该解析并获取对象,代表菜单。解析器逐行创建新的菜单节点。然后解析器应该在现有树的某个地方插入这个全新的节点。虽然我们可以使用深度优先或广度优先的方法每次从根开始搜索,但将添加的节点存储在 HashMap 中会更有效,尤其是在我们的菜单结构很大的情况下。所以,我们需要带有解析器的 MenuTree:

    package my.menu;
    import java.util.LinkedList;
    import java.util.HashMap;
    
    public class MenuTree{
        private HashMap<Integer, MenuNode> menuMap;
    
        public void addNode(MenuNode node) {
            MenuNode parent = menuMap.get(node.getParent());
            if (parent != null) {
                parent.addChild(node);
            }        
        }
    
        public void parse(LinkedList<Menu> input) {
            for (Menu entry : input) {
                MenuNode node = new MenuNode(entry.id, entry.name);
                MenuNode parent = menuMap.get(entry.parentId);
                if (parent != null) {
                    parent.addChild(node);
                }
                menuMap.put(node.getId(), node);
            }
        }
    }
    

    2。访问菜单

    现在我们可以通过检索MenuNodechildren LinkedList 或通过添加一些方法来迭代MenuTree 中的menuMap 来遍历菜单。这取决于我们要解决的任务。

    【讨论】:

      【解决方案2】:

      您可以将不同级别的菜单保存在不同的arrayList 中。然后为每个菜单检查其parentId 与当前parentId 正在迭代。如果它们匹配显示subMenu,否则通过。这样您就可以创建嵌套的多级菜单。

      您可以使用包含parentMenu 作为键和subMenu arrayList 作为值的映射。 Map&lt;ParentMenu, List&lt;String&gt;&gt;。但如果您只有两级菜单,这是一个很好的解决方案。超过两个级别就变得笨拙了。

      【讨论】:

      • 需要通用解决方案
      猜你喜欢
      • 2020-03-22
      • 2014-07-23
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多