工作总结获取树的子节点及树的复制
一:树节点的结构
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