部门树生成 双重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次。
所以要看业务情况使用。