有一个关于如何在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并显示多级菜单导航列表。
代码必须是所有级别的通用代码,并且应该轻松地涵盖所有级别
答案 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
来遍历菜单。这取决于我们试图解决的任务。