获取多级菜单这件事情几乎在每个项目中都会遇到。以前的项目因为菜单只有两级并且不会添加深度,为了方便就直接手写两层循环把事情解决了。
后来维护的时候就觉得代码非常的啰嗦,而且因为循环里的东西太多,也不敢全部打开来修改,生怕把这堆本来就乱七八糟的程序彻底玩坏。
今年经历了一个项目,里面的多级菜单可以让用户自己添加深度,于是以前的代码就不适用了,虽然为了赶工硬着头皮写了五层循环把可能达到的深度问题给掩盖掉了,后来打开来看的时候自己也觉得不舒服,一来太长,重复的地方太多,而且虽然不可能,但是遇到用户误操作把深度加的更深的话连修改都做不到,因为显示不出来,于是决定趁着这几天东西比较少把这个历史遗留问题彻底解决。
其实思路很简单,把获取到的列表按照每个节点递归下去,逐渐把整个多叉树构建出来,但是具体的条件让我纠结了很久,也是暴露了基础能力的问题。
import java.util.List;
// 源数据
public class SourceDataPackage {
public int status;
public int reCount;
public String Message;
public List
data;
}import java.util.List;
public class NodeTree {
public int id;
public String name;
public int OwnerId;
public List
children;
}public class Menu {
public NodeTree getMenu() {
String jsonData = WSDLService.service.getNodeTree();// 项目上通过wsdl获取源数据
Gson gson = new Gson();
SourceDataPackage sourceDataPackage = gson.fromJson(jsonData, SourceDataPackage.class);
List
data = sourceDataPackage.data;
NodeTree nodeTree = new NodeTree();
for(SourceData sourceData : data) {
if(sourceData.OwnerDeptId == 0) {
nodeTree.id = sourceData.id;
nodeTree.name = sourceData.name;
nodeTree.children = new ArrayList<>();
break;
}
}
getResult(data, nodeTree);
return nodeTree;
}
private void getResult(List
data, NodeTree parentNodeTree) {
for(SourceData sourceData : data) {
if(nodeTree.id == sourceData.ownerid) {
NodeTree nodeTree = new NodeTree();
nodeTree.id = sourceData.id;
nodeTree.name = sourceData.name;
nodeTree.children = new ArrayList<>();
parentNodeTree.children.add(nodeTree);
getResult(data, nodeTree);
}
}
}
}public class SourceData {
public int id;
public String name;
public int OwnerId;
}
看到有人说递归的效率很低,那么像这种动态多级菜单的问题是否能通过非递归的方式去解决呢?
晚上瞎逛的时候看到一个帖子说了非递归的方法,似乎有优先深度遍历和优先广度遍历,转载一下地址,侵删。