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

只谈情不闲聊 提交于 2020-01-10 15:52:31

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一:树节点的结构

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;
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!