Java教程

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

本文主要是介绍部门树生成 双重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次。

所以要看业务情况使用。

这篇关于部门树生成 双重for循环代替递归 java的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!