部门树生成 双重for循环代替递归 java

部门树生成 双重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次。

所以要看业务情况使用。

上一篇:CSAPP bomb实验


下一篇:C#实现平滑加权轮询WeightedRoundRobin