这里的问题应该分解为两部分:建筑菜单和访问菜单。结果菜单有效定向非循环图或树。每个菜单项是此树节点:
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
children
LinkedList的或通过添加一些方法MenuTree
遍历menuMap
。这取决于我们正在努力解决的任务。
需要一个通用的解决方案 – shashi27 2014-11-25 09:36:05