java转换list成tree的数据结构

2022-07-28 07:56:12

1、Java递归将List数据转换为Tree结构数据

https://blog.csdn.net/yuan_xiaohou/article/details/82461892?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_v2~rank_aggregation-1-82461892.pc_agg_rank_aggregation&utm_term=Java+%E5%B0%86list%E8%BD%AC%E6%8D%A2%E4%B8%BAtree&spm=1000.2123.3001.4430

2、java8使用stream()转化

https://blog.csdn.net/weixin_33725126/article/details/93244840

3、递归组装

https://blog.csdn.net/xcymorningsun/article/details/79254819

4、java8.stream().map()

// 调用转化的方法tree2List(menuPermissions,0L);// 递归***list转化成tree的递归方法!!!privateList<MenuPermission>tree2List(List<MenuPermission> menus,Long parentId){return menus.stream().map(l->{// 如果当前节点是parentId的一个孩子Aif(parentId.equals(l.getParentId())){// 获取孩子A的所有孩子As找出来,并标记到A的children list中存起来List<MenuPermission> cNode=treeList(menus, l.getId());
                        l.setChildren(cNode);// 遍历list当前的节点i,设置完成该节点i的所有children之后,就该返回了;// 返回也就是:继续在menus列表中找下一个结点的所有childrenreturn l;}returnnull;}).filter(Objects::nonNull).sorted(Comparator.comparing(MenuPermission::getSort,Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());}
// 加载菜单树(递归方法的调用)publicList<MenuPermission>loadMenu(JwtUser jwtUser){/* 获取list */// 获取该用户有权限访问的菜单列表(直接从数据库中拿到的)Set<OdiMenu> menus=newHashSet<>();if(!CollectionUtils.isEmpty(jwtUser.getRoles())){for(OdiRole l: jwtUser.getRoles()){if(DefaultRoleEnmu.SUPER_ADMIN.name().equals(l.getCode())){List<OdiMenu> odiMenus= odiMenuMapper.queryAll();
                    menus.addAll(odiMenus);}else{List<OdiMenu> odiMenus= odiMenuMapper.queryUserMenu(l.getId());
                    menus.addAll(odiMenus);}}}/* 转化成tree list */// 使用list().stream().map(...).collect(Collectors.toList())得到权限树 treeListif(!CollectionUtils.isEmpty(menus)){// 1. 初始化菜单权限对象也是一个listList<MenuPermission> menuPermissions= menus.stream().map(l->{MenuPermission menuPermission=newMenuPermission();BeanUtils.copyProperties(l, menuPermission);
                        menuPermission.setLevel(Integer.valueOf(l.getLevel()));
                        menuPermission.setSort(Integer.valueOf(l.getSort()));return menuPermission;}).collect(Collectors.toList());// 2. 把list转化成tree的数据结构!!!returntree2List(menuPermissions,0L);}returnnull;}

5、生成指标树返回的之后一个vo对象 |不是list对象

/**
     * 生成量表中的指标树
     * @param top   顶层指标
     * @param list  所有指标列表(数据库中查出来的)
     * @return
     */publicDiagnosisMetricVosetChild(DiagnosisMetricVo top,List<DiagnosisMetric> list){// 出口if(list.size()==0){return top;}// 设置子节点List<DiagnosisMetricVo> childs=getChilds(top, list);
        top.setChildList(childs);// 遍历子节点 并为之设置子节点for(DiagnosisMetricVo child: childs){setChild(child, list);}return top;}/**
     * 获取子指标
     * @param top
     * @param list
     * @return
     */privateList<DiagnosisMetricVo>getChilds(DiagnosisMetricVo top,List<DiagnosisMetric> list){// 筛选子指标List<DiagnosisMetric> childs= list.stream().filter(a->{return top.getId().equals(a.getParentId());}).collect(Collectors.toList());// 转成voList<DiagnosisMetricVo> vos= childs.stream().map(a->{DiagnosisMetricVo mvo=newDiagnosisMetricVo();BeanUtils.copyProperties(a, mvo);return mvo;}).collect(Collectors.toList());return vos;}

vo对象(特别注意最后的private List<DiagnosisMetricVo> childList 为子指标列表)

@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclassDiagnosisMetricVoimplementsSerializable{/**
     * 主键
     */privateString id;/**
     * 指标名称
     */privateString name;/**
     * 父节点Id 
	 * parentId=top 时为顶级节点
     */privateString parentId;/**
     * 子节点列表
     */privateList<DiagnosisMetricVo> childList;}

递归删除表中的记录

privatevoiddelete(String scaleId,String metricId){// 删除中间表记录
        diagnosisScaleMetricMapper.deleteByScaleAndMetricId(scaleId, metricId);// 获取当前指标的子指标List<DiagnosisScaleMetric> diagnosisScaleMetrics= diagnosisScaleMetricMapper.getChildrenByMetricId(scaleId, metricId);// 出口指标数为0if(diagnosisScaleMetrics.size()==0){return;}// 删除子指标对应的记录
        diagnosisScaleMetrics.forEach(sm->{delete(scaleId, sm.getMetricId());});}
  • 作者:m0_46325101
  • 原文链接:https://blog.csdn.net/m0_46325101/article/details/119678985
    更新时间:2022-07-28 07:56:12