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

编程

一:树节点的结构

class KprDimension{

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

private String name; //树节点名称

private String parentId;// 树节点父id

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

private List<KprDimension> children;//树的子节点

}

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


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

1.1 思路

项目中用到了维度的概念,其关系如同树结构一样,现在有个需求要获取最底层的维度,转换为获取树结构没有子节点的节点。

将数据库中的数据读取出来,转换为树结构即可。或者采用SQL语句直接转换为树结构。

1.2 递归调用

    /**

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

*

* @param kprDimension

* @param returnList

* @return returnList

*/

private List<KprDimension> getChildrenDimensions(KprDimension kprDimension,List<KprDimension> returnList){

List<KprDimension> 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<Map<String,String>> copyDimensionByAssessmentId(String copyAssessmentId, String newAssessmentId) throws CommonException {

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

EntityWrapper<KprDimension> ew =new EntityWrapper<>();

ew.eq("assessment_id",copyAssessmentId);

List<KprDimension> dimensionList = this.selectList(ew);

Map<String,String> old_new_dimensionId_map = new HashMap<>(10);

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

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

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

List<KprDimension> 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;

}

以上是 工作总结获取树的子节点及树的复制 的全部内容, 来源链接: utcz.com/z/512579.html

回到顶部