李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
复制菜单树形结构信息
Leefs
2021-05-14 PM
2381℃
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://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
标签云
Livy
Spark RDD
Ubuntu
GET和POST
DataX
二叉树
人工智能
国产数据库改造
队列
Redis
Kafka
稀疏数组
Elastisearch
Quartz
正则表达式
Git
算法
随笔
Spark Core
Elasticsearch
Docker
Java编程思想
序列化和反序列化
Typora
MyBatis-Plus
LeetCode刷题
Filter
VUE
Jquery
Python
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
李林超牛皮
菜鸟一个