Java递归--无限级分类
2022-01-18 本文已影响0人
想象之中丶意料之外
递归
-
一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。凡是递归的函数,都是可计算的,即能行的。
-
古典递归函数,是一种定义在自然数集合上的函数,它的未知值往往要通过有限次运算回归到已知值来求出,故称为“递归”。它是古典递归函数论的研究对象。
无限级分类--递归分析
- 通过1级分类,找到当前分类下的子集分类。
- 当找到一个子分类时,可能该子分类也有子集分类,所有再找这个子分类的子集分类。
- 如此反复,即完成,所有分类的归纳。
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无限级分类递归法