标签:java 递归 双重 deptNode 部门 循环 nodes children
部门树生成 双重for循环代替递归
介绍
业务问题:生成部门树。
第一思路是递归的方式,获取当前部门的所有子部门,接着再去递归子部门。但其实使用for循环也可以做到。
代码:
private List<DeptNode> generateTree(List<Dept> list) {
List<DeptNode> nodes = new ArrayList<>(20);
for (Dept dept : list) {
DeptNode deptNode = new DeptNode();
BeanUtils.copyProperties(dept, deptNode);
nodes.add(deptNode);
}
for (DeptNode deptNode : nodes) {
for (DeptNode child : nodes) {
if (child.getPid().intValue() == deptNode.getId().intValue()) {
List<DeptNode> children = deptNode.getChildren();
if (children == null) {
children = Lists.newArrayList();
deptNode.setChildren(children);
}
children.add(child);
}
}
}
List<DeptNode> result = new ArrayList<>(20);
for (DeptNode node : nodes) {
if (node.getPid().intValue() == 0) {
result.add(node);
}
}
return result;
}
先将所有部门查出放入到一个列表,接着两次for循环这个列表,在循环中给部门设置每个部门的children子部门。循环完成后,所有的部门的子部门children都已经设置完成。
最后再次循环整个部门列表,只取顶级部门,不直接展示子部门,因为子部门已经被设置到了顶级部门的children中(或者children的children…),所以不需要重复展示。
问题
这种两次for循环方式也有问题。
假如说只需要某部门的子部门,如果使用上面这种方式就要循环所有的部门,把所有部门设置完子部门放入列表后,再从这个列表根据id找到所需要的部门。
而如果使用递归,只需要传入该部门的id,程序就可以先获取该部门的子部门,再根据子部门递归下去。
如果感觉不到区别,考虑极端情况,1000个部门都是顶级部门,要查某部门的子部门信息,两次for循环要100万次,递归只需要1次。
所以要看业务情况使用。
标签:java,递归,双重,deptNode,部门,循环,nodes,children 来源: https://blog.csdn.net/qq_34626094/article/details/122582780
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。