java 获取树的子节点,工作总结---获取树的子节点及树的复制

本文介绍如何在Java中获取树结构的最下级子节点,并详细阐述了一个递归方法,用于找到没有子节点的节点。此外,还讨论了如何在数据库中复制树结构,通过遍历树的层级并更新ID来保持复制后的独立性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:树节点的结构

class KprDimension{

private String id; //树的当前节点id

private String name; //树节点名称

private String parentId;// 树节点父id

private Integer level; //树的节点层级,如下图的A即为1,B,C即为2

private List children;//树的子节点

}

1 获取树的最下级子节点(即子节点为空的节点)

c652c9a65544921587af4160f4a27b71.png

即获取图中树的没有子节点的节点:G、H、I、J、F这几个节点。

1.1 思路

项目中用到了维度的概念,其关系如同树结构一样,现在有个需求要获取最底层的维度,转换为获取树结构没有子节点的节点。 将数据库中的数据读取出来,转换为树结构即可。或者采用SQL语句直接转换为树结构。

1.2 递归调用

/**

* 递归调用获取最底层维度

*

* @param kprDimension

* @param returnList

* @return returnList

*/

private List getChildrenDimensions(KprDimension kprDimension,List returnList){

List childrenList = kprDimension.getChildren();

// 退出递归的条件 只有一层维度结构

if(childrenList==null || childrenList.size()<=0){

returnList.add(kprDimension);

}else{

// 有多层维度结果

for(KprDimension childrenDimension : childrenList){

getChildrenDimensions(childrenDimension,returnList);

}

}

return returnList;

}

参数returnList,即为入参,也为出参,用于存储递归中满足条件的节点(没有子节点的节点)。思路很简单,实现也很简单,主要是存储满足条件的参数,用入参来存储。

2 树结构在数据库的复制

在数据库中树结构是一条一条的数据,项目有个需求要复制这些数据,但是id,parentId不能相同,也就是只复制树的结构及部分信息,但是id等信息必须替换,以免一个用户操作复制后的信息,会同时修改或删除原始信息。

2.1 思路

根据数据库中的level,进行一级一级的复制,每复制一条信息,将原始id及复制后的新id存入map集合。

复制第一层时,只有id,没有parentId,因此,成功复制,此时map 集合中有了《旧id,新id》的对应关系。

根据level复制树的第二层时,此时需要替换其中的parentId,因为第一层结构有了map的id对应关系,直接用parentId做为map集合的key即可获取到新关系的id(对应树的第二层结构来说即为parentId)。

第三层,同第二层一样,此时替换parentId时,map集合中已经有了第一级、第二级的id对应关系,直接取值即可。因为复制是按照树的层级来复制的,待复制的parentId是一定先与复制前就存放在map集合中了。

2.2 代码实现

有部分删减,主要表达个思路。

@Override

public RetEntity> copyDimensionByAssessmentId(String copyAssessmentId, String newAssessmentId) throws CommonException {

// 查找数据库中待复制的所有维度

EntityWrapper ew =new EntityWrapper<>();

ew.eq("assessment_id",copyAssessmentId);

List dimensionList = this.selectList(ew);

Map old_new_dimensionId_map = new HashMap<>(10);

// 根据维度的层级分类(即树结构第一层,第二层)

Map> dimensionMap = dimensionList.stream().collect(Collectors.groupingBy(KprDimension::getRank));

for (int i = 1; i <= dimensionMap.size(); i++) {

List list = dimensionMap.get(i);

Collections.sort(list);

// 第一级维度(维度的rank序号从一开始)

if (i == 1) {

for(KprDimension kprDimension : list){

String newDimensionId = IdWorker.get32UUID();

old_new_dimensionId_map.put(kprDimension.getId(),newDimensionId);

kprDimension.setId(newDimensionId);

this.insertAllColumn(kprDimension)

}

} else{

for(KprDimension kprDimension : list){

// 获取父维度id

String parentDimensionId =old_new_dimensionId_map.get(kprDimension.getParentDimensionId());

String newDimensionId = IdWorker.get32UUID();

old_new_dimensionId_map.put(kprDimension.getId(),newDimensionId);

kprDimension.setId(newDimensionId);

kprDimension.setParentDimensionId(parentDimensionId);

this.insertAllColumn(kprDimension)

}

}

}

}

return null;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值