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

时间:2014-11-25 06:32:44

标签: java database data-structures collections

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

以下是 MENU

的数据库表格数据

id menu_name parent_id
1 main1 null
2 bank1 1
3 test1 2
4 test2 2
5 test3 2
6 bank2 1
7 test4 6
8 test5 6
9 test6 6

类菜单用作菜单

的模型
public class Menu {

    private int id;

    private String menuName;

    private int parentId;
}

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

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

代码必须是所有级别的通用代码,并且应该轻松地涵盖所有级别

2 个答案:

答案 0 :(得分:0)

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

您可以使用包含parentMenu作为键的地图和subMenu arrayList作为值。 Map<ParentMenu, List<String>>。但如果您只有两级菜单,那么这是一个很好的解决方案。超过两个级别,它变得笨拙。

答案 1 :(得分:0)

这里的问题应该分解为两部分:建筑菜单和访问菜单。结果菜单实际上是Directed Acyclic Graph或Tree。每个菜单项都是此树中的节点:

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。建筑菜单

你有一些来自数据库的列表,你应该解析并获取对象,代表菜单。解析器逐行进行,创建新的菜单节点。然后解析器应该在现有树中的某处插入这个全新的节点。虽然我们每次都可以使用深度优先或广度优先方法从root搜索,但在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。访问菜单

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

相关问题