李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
复制菜单树形结构信息
Leefs
2021-05-14 PM
2429℃
2条
# 复制菜单树形结构信息 ### 需求描述 > 通过分组菜单对某一项进行复制操作,最后生成一个结构和序号完全一样的新树形分组。 ![3.复制菜单树形结构信息01.jpg](https://lilinchao.com/usr/uploads/2021/05/2123318702.jpg) ### 代码 > 实体类Group ```java public class Group { private String id; private String name; private String parentId; private Integer order; private List
child; public Group(String id, String name, String parentId, Integer order) { this.id = id; this.name = name; this.parentId = parentId; this.order = order; } public Group() { } //省略get和set方法 } ``` > 生成UUID类 ```java public class UUid { public static String getUUID(){ UUID uuid=UUID.randomUUID(); String str = uuid.toString(); String uuidStr=str.replace("-", ""); return uuidStr; } } ``` > 主函数GroupMain ```java import com.dataojo.common.UUid; import com.google.gson.Gson; import java.util.*; import java.util.stream.Collectors; public class GroupMain { //作为数据库 static List
groupDataSource = new ArrayList<>(); static List
childGroups = new ArrayList<>(); //通过Map集合记录原始、新生成Id static Map
hashMap = new HashMap<>(); public static void main(String ages[]){ GroupMain groupMain = new GroupMain(); List
groupList = groupMain.groupData(); // System.out.println(groupList.toString()); groupDataSource = groupMain.groupDataSourceSort(groupList); //复制树形结构 copyGroupTree(groupDataSource,groupList.get(0).getId()); System.out.println(groupDataSource); //生成树 List
groupTreeList = groupMain.createGroupTree(groupDataSource); Gson gson = new Gson(); String toJson = gson.toJson(groupTreeList); System.out.println(toJson); childGroups.clear(); hashMap.clear(); groupDataSource.clear(); } /** * 源数据根据分组从大到小排序 * @param groupDataSource * @return */ private List
groupDataSourceSort(List
groupDataSource) { if(groupDataSource == null || groupDataSource.size()<1){ return groupDataSource; } Map
> mapList = groupDataSource.stream().sorted(Comparator.comparingInt(Group::getOrder).reversed()).collect(Collectors.groupingBy(Group::getParentId)); /*List
groupList = new ArrayList<>(); for (Map.Entry
> stringListEntry : mapList.entrySet()) { groupList.addAll(stringListEntry.getValue()); }*/ List
groupList = mapList.values().stream().flatMap(x -> x.stream()).collect(Collectors.toList()); return groupList; } /** * @param groupList 所有分组菜单数据 * @param id 需要复制树形结构Id */ private static void copyGroupTree(List
groupList, String id) { //根据Id查询其所有子集Id GroupMain groupMain = new GroupMain(); groupMain.treeChildList(groupList,id); childGroups.add(id); System.out.println(childGroups); if(childGroups != null && childGroups.size()>0){ for(int t =childGroups.size()-1;t>=0;t--){ groupMain.copyGroupTreeInfo(childGroups.get(t)); } } } /** * 通过Id添加树 * @param s */ private void copyGroupTreeInfo(String s) { GroupMain groupMain = new GroupMain(); Group newGroup = null; String parentId = "0"; for(Group group:groupDataSource){ String id = group.getId(); if(id.equals(s)){ newGroup = group; break; } } if(!"0".equals(newGroup.getParentId())){ parentId = hashMap.get(newGroup.getParentId()); } String newId = groupMain.add(newGroup,parentId); hashMap.put(s,newId); } /** * 根据父级Id查询所有子集Id * @param groupList * @param pid */ private void treeChildList(List
groupList, String pid) { for (Group group: groupList) { //遍历出父id等于参数的id,add进子节点集合 if (pid.equals(group.getParentId())) { //递归遍历下一级 treeChildList(groupList,group.getId()); childGroups.add(group.getId()); } } } //生成树 private List
createGroupTree(List
groupList) { List
groupTreeList = new ArrayList<>(); List
parentGroupList = new ArrayList<>(); for (Group group : groupList) { String parentId = group.getParentId(); //找到所有一级目录 if ("0".equals(parentId)) { groupTreeList.add(group); parentGroupList.add(group); } } groupList.removeAll(parentGroupList); for (Group group : groupTreeList) { getGroupData(groupList, group); } return groupTreeList; } private void getGroupData(List
groupList, Group group) { List
deleteGroup = new ArrayList<>(); String id = group.getId(); List
groupList2and = new ArrayList<>(); groupList.forEach(a -> { String parentId = a.getParentId(); if(id.equals(parentId)){ groupList2and.add(a); deleteGroup.add(a); } }); group.setChild(groupList2and); groupList.removeAll(deleteGroup); if (groupList2and.size() > 0) { groupList2and.forEach(a -> getGroupData(groupList, a)); } } //添加方法 public String add(Group group,String parentId){ String id = UUid.getUUID(); //通过Stream流根据父Id进行分组,根据order排序返回最大值 int order = streamGroupSort(groupDataSource,parentId); Group newGroup = new Group(id,group.getName(),parentId,order+1); groupDataSource.add(newGroup); return id; } /** * 根据父Id返回Order最大值 * @param groupDataSource * @return */ private int streamGroupSort(List
groupDataSource,String parentId) { if(groupDataSource == null || groupDataSource.size()<1){ return 0; } /*Map
groupMap = groupDataSource.stream().collect(Collectors.groupingBy(Group::getParentId, Collectors.collectingAndThen(Collectors.reducing((c1,c2)->c1.getOrder() > c2.getOrder() ? c1:c2), Optional::get))); int order = groupMap.get(parentId) == null ? 0 : groupMap.get(parentId).getOrder();*/ Integer order = groupDataSource.stream().filter(x -> x.getParentId().equals(parentId)).map(Group::getOrder).collect(Collectors.maxBy(Integer::compare)).orElse(0); return order; } //赋初值 public List
groupData(){ List
groupList = new ArrayList<>(); //当父级为0时,代表为第一级 //排序字段order:只对同级目录进行排序 String group01_Id = UUid.getUUID(); String group02_Id = UUid.getUUID(); Group group01 = new Group(group01_Id,"分组菜单一","0",1); Group group01_1 = new Group(UUid.getUUID(),"分组菜单1.1",group01_Id,1); Group group01_2= new Group(UUid.getUUID(),"分组菜单1.2",group01_Id,2); /*List
groupList01 = new ArrayList<>(); groupList01.add(group01_1); groupList01.add(group01_2); group01.setChild(groupList01);*/ Group group02 = new Group(group02_Id,"分组菜单二","0",2); Group group02_1 = new Group(UUid.getUUID(),"分组菜单2.1",group02_Id,1); Group group02_2 = new Group(UUid.getUUID(),"分组菜单2.2",group02_Id,2); /* List
groupList02 = new ArrayList<>(); groupList02.add(group02_1); groupList02.add(group02_2); group02.setChild(groupList02);*/ groupList.add(group01); groupList.add(group01_1); groupList.add(group01_2); groupList.add(group02); groupList.add(group02_1); groupList.add(group02_2); return groupList; } } ``` **运行结果** ```json [ { "id": "ea0c730e1b8d4002bb7c69a59f6e1988", "name": "分组菜单二", "parentId": "0", "order": 2, "child": [ { "id": "e14f3106dbc642efb480563494b578a8", "name": "分组菜单2.2", "parentId": "ea0c730e1b8d4002bb7c69a59f6e1988", "order": 2, "child": [] }, { "id": "a1cf2b4cc4c4422e9291d25bc8400122", "name": "分组菜单2.1", "parentId": "ea0c730e1b8d4002bb7c69a59f6e1988", "order": 1, "child": [] } ] }, { "id": "de40b38d824f40d89b0836c95110c3ed", "name": "分组菜单一", "parentId": "0", "order": 1, "child": [ { "id": "dc62756f9e624c59aba8ea59ab724899", "name": "分组菜单1.2", "parentId": "de40b38d824f40d89b0836c95110c3ed", "order": 2, "child": [] }, { "id": "ebcc6858382b41578b95baaea7ac8b4e", "name": "分组菜单1.1", "parentId": "de40b38d824f40d89b0836c95110c3ed", "order": 1, "child": [] } ] }, { "id": "8e2f7c89207d4b76af2de56a3ba6b38a", "name": "分组菜单一", "parentId": "0", "order": 3, "child": [ { "id": "cc680a9c003b49e1a6969d05565214e9", "name": "分组菜单1.1", "parentId": "8e2f7c89207d4b76af2de56a3ba6b38a", "order": 1, "child": [] }, { "id": "49b0ad933fdc4a738a8221a0077df00f", "name": "分组菜单1.2", "parentId": "8e2f7c89207d4b76af2de56a3ba6b38a", "order": 2, "child": [] } ] } ] ``` ### 总结 本篇文章融合了 + 树形结构复制 + 通过Stream进行分组并排序 + 通过Stream进行分组返回排序字段最大值 + 根据父级Id递归查询所有子集Id + 生成树形结构 方法前都增加了注释需要的小伙伴可以在代码中自取
标签:
Java
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/1253.html
上一篇
三、Stream流分组操作
下一篇
01.Livy工作原理简介
取消回复
评论啦~
提交评论
已有 2 条评论
同桌
李林超牛皮
回复
2021-06-01 11:42
Leefs
博主
@同桌
菜鸟一个
回复
2021-06-01 11:44
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Beego
DataX
nginx
JVM
Ubuntu
并发编程
查找
LeetCode刷题
VUE
高并发
链表
Thymeleaf
正则表达式
锁
Redis
RSA加解密
国产数据库改造
数学
MyBatis
CentOS
Nacos
SpringBoot
MyBatis-Plus
Python
Sentinel
SpringCloudAlibaba
工具
ajax
Filter
Eclipse
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
李林超牛皮
菜鸟一个