Java (N) ui中迭代的多级菜单数据结构

Java (N) ui中迭代的多级菜单数据结构,java,database,data-structures,collections,Java,Database,Data Structures,Collections,有一个关于如何在java中处理n级菜单和在ui中进一步迭代的问题 下面是菜单的数据库表数据 id菜单\u name parent\u id 1主1空 2银行1 3测试1 2 4测试2 5测试3 2 6银行2 1 7测试4 6 8测试5 6 9测试6 6 类菜单用作菜单表的模型 public class Menu { private int id; private String menuName; private int parentId; } 从数据库检索的数据存

有一个关于如何在java中处理n级菜单和在ui中进一步迭代的问题

下面是菜单的数据库表数据

id菜单\u name parent\u id
1主1空
2银行1
3测试1 2
4测试2
5测试3 2
6银行2 1
7测试4 6
8测试5 6
9测试6 6

类菜单用作菜单表的模型

public class Menu {

    private int id;

    private String menuName;

    private int parentId;
}
从数据库检索的数据存储在
ArrayList

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


代码需要是所有级别的通用代码,并且应该可以轻松地将所有级别的菜单保存起来

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


您可以使用包含
父菜单
作为键和
子菜单
数组列表作为值的映射<代码>地图
。但如果只有两级菜单,这是一个很好的解决方案。有两个以上的级别,它会变得笨拙。

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

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;
    }
}
打包我的菜单;
导入java.util.LinkedList;
公共类菜单节点{
私有MenuNode父节点;
私人关系人子女;
私有字符串名称;
私有int-id;
公共菜单节点(字符串名称,int-id){
this.name=名称;
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共int getId(){
返回id;
}
公共菜单项getParent(){
返回父母;
}
public void setParent(菜单节点parent){
this.parent=parent;
}
public void addChild(MenuNode child){
添加(child);
child.setParent(this);
}
公共链接列表getChildren(){
返回儿童;
}
}
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);
        }
    }
}
打包我的菜单;
导入java.util.LinkedList;
导入java.util.HashMap;
公共类菜单{
私有HashMap菜单;
公共void addNode(菜单节点){
menunodeparent=menuMap.get(node.getParent());
如果(父项!=null){
parent.addChild(节点);
}        
}
公共无效解析(LinkedList输入){
用于(菜单项:输入){
MenuNode节点=新的MenuNode(entry.id,entry.name);
menunodeparent=menuMap.get(entry.parentId);
如果(父项!=null){
parent.addChild(节点);
}
menuMap.put(node.getId(),node);
}
}
}
2。访问菜单


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

需要通用解决方案吗