Java学习笔记

Java递归--无限级分类

2022-01-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无限级分类递归法

上一篇下一篇

猜你喜欢

热点阅读