美文网首页Java学习笔记
Java递归--无限级分类

Java递归--无限级分类

作者: 想象之中丶意料之外 | 来源:发表于2022-01-18 16:18 被阅读0次

    递归

    • 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。凡是递归的函数,都是可计算的,即能行的。

    • 古典递归函数,是一种定义在自然数集合上的函数,它的未知值往往要通过有限次运算回归到已知值来求出,故称为“递归”。它是古典递归函数论的研究对象。


    无限级分类--递归分析

    1. 通过1级分类,找到当前分类下的子集分类。
    2. 当找到一个子分类时,可能该子分类也有子集分类,所有再找这个子分类的子集分类。
    3. 如此反复,即完成,所有分类的归纳。

    Java 实现

    /**
     * 分类节点Bean
     */
    @Data
    public class TreeNode {
        // 分类名
        private String name;
        // 分类id
        private String id;
        // 父分类id
        private String parentId;
        // 子分类集合
        private List<TreeNode> children;
    }
    
    /**
      * 分类 处理方法。将数据库结果,处理成分类数据结构
      * @param list 数据库数据
     * @return 整理后的分类数据结构
     */
    private List<TreeNode> doTreeNodes(List<Resources> list) {
        // 将数据整理成 TreeNode
        List<TreeNode> treeNodes = new ArrayList<>();
        for (Resources item : list) {
            TreeNode treeNode = new TreeNode();
            treeNode.setId(item.getId());
            treeNode.setParentId(item.getParentid());
            treeNode.setName(item.getName());
            treeNodes.add(treeNode);
        }
            
        // 声明存储新的TreeNodes变量
        List<TreeNode> newTreeNodes = new ArrayList<>();
        for (TreeNode treeNode : treeNodes) {
            // 从1级分类开始,一个一个往下找
            if (StrUtil.isBlank(treeNode.getParentId())) {
                newTreeNodes.add(findChildren(treeNode, treeNodes));
            }
        }
        // 返回最后结果
        return newTreeNodes;
    }
    
    /**
     * 递归算法,查找当前Node下的一个子节点,
     *                    并接着找该子节点下的子节点
     *
     * @param cNode    当前Node节点
     * @param nodeList Node节点数组
     * @return 返回当前节点
     */
    private TreeNode findChildren(TreeNode cNode, List<TreeNode> nodeList) {
        for (TreeNode node : nodeList) {
            // 找到属于当前Node的子Node
            if (cNode.getId().equals(node.getParentId())) {
                // 初始化当前Node中子Node结合(TreeNode中children属性初始化)
                if (null == cNode.getChildren()) {
                    cNode.setChildren(new ArrayList<>());
                }
                // 将当前子节点,作为当前节点。让程序接着找该子节点的子节点
                cNode.getChildren().add(findChildren(node, nodeList));
            }
        }
        return cNode;
    }
    

    参考:Java无限级分类递归法

    相关文章

      网友评论

        本文标题:Java递归--无限级分类

        本文链接:https://www.haomeiwen.com/subject/levkhrtx.html