业务问题:生成部门树。
第一思路是递归的方式,获取当前部门的所有子部门,接着再去递归子部门。但其实使用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次。
所以要看业务情况使用。