对如何处理 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>>
.但是,如果您只有两级菜单,这是一个很好的解决方案。超过两级,它变得笨拙。