(N)用于在 UI 中进行迭代的多级菜单数据结构



对如何处理 java 中的 n 级菜单和 ui 中的进一步迭代有疑问。

以下是 MENU 的数据库表数据

身份证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

类菜单用作菜单表的模型

public class Menu {
    private int id;
    private String menuName;
    private int parentId;
}

从数据库中检索的数据存储在ArrayList<Menu>

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

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

在一起

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

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. 访问菜单

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

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

您可以使用包含parentMenu作为键和subMenu数组列表作为值的映射。 Map<ParentMenu, List<String>> .但是,如果您只有两级菜单,这是一个很好的解决方案。超过两级,它变得笨拙。

最新更新