树形结构设计总结,对于像部门,权限这样
2018-03-04 17:40
435 查看
1.树形结构三要素:
parentId:父节点id;
level:设计模式父节点的id+level。顶级节点的level默认值0;
seq:同一层级排序。
2.遍历:
主要思路:同一层级的节点保存在key为level的map结构中。这样就可以通过level拿到所有的子节点。
3.树形结构修改
1是root节点,1下有两个节点2,3。2下有一个节点4。4下有一个节点5.
那么修改规则如下:将4放到3下面。同时更新4的子节点的level。
思路:
(1)创建两个对象before,after来分别表示更新之前4的信息。
before:0.1.2 after 0.1.3
(2)通过before的id拿到ParentId为id的所有子节点。
(3)遍历自己点集合。
将子节点的level的前缀删除了before的level剩下就是层次结构中不动的部分 childLevel。
newLevel = after.getLevel()+childLevel;即最新的level。
子节点5level 0.1.2.4。删除修改之前父节点level。剩下4;
4结合修改之后的Level即0.1.3生成新的level:0.1.3.4即最新level.
parentId:父节点id;
level:设计模式父节点的id+level。顶级节点的level默认值0;
seq:同一层级排序。
2.遍历:
主要思路:同一层级的节点保存在key为level的map结构中。这样就可以通过level拿到所有的子节点。
3.树形结构修改
1是root节点,1下有两个节点2,3。2下有一个节点4。4下有一个节点5.
那么修改规则如下:将4放到3下面。同时更新4的子节点的level。
思路:
(1)创建两个对象before,after来分别表示更新之前4的信息。
before:0.1.2 after 0.1.3
(2)通过before的id拿到ParentId为id的所有子节点。
(3)遍历自己点集合。
将子节点的level的前缀删除了before的level剩下就是层次结构中不动的部分 childLevel。
newLevel = after.getLevel()+childLevel;即最新的level。
子节点5level 0.1.2.4。删除修改之前父节点level。剩下4;
4结合修改之后的Level即0.1.3生成新的level:0.1.3.4即最新level.
package com.lai.tree.service; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.collections.CollectionUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.lai.tree.common.LevelUtil; import com.lai.tree.pojo.Dept; import com.lai.tree.pojo.DeptLevelDto; public class DeptService { public static void main(String[] args) throws Exception { DeptService deptService = new DeptService(); // getLevelDept(deptService); changeLevelDept(deptService); // deleteLevelDept(deptService); } private static void changeLevelDept(DeptService deptService) throws Exception { List<Dept> levelDeptList = deptService.getLevelDept(); //将id为4的部门挂到id为1上面 Dept parentDept = new Dept(); parentDept.setId(1); parentDept.setLevel(LevelUtil.ROOT); Dept before = deptService.getLevelDeptById(4); DeptLevelDto after = new DeptLevelDto(); after.setId(4); after.setParentId(1); after.setLevel(LevelUtil.calculateLevel(parentDept.getLevel(), parentDept.getId())); List<Dept> childDeptList = deptService.getChildLevelDept(); for (Dept dept: childDeptList) { String beforeLevel = dept.getLevel(); if(beforeLevel.indexOf(before.getLevel()) == 0) { String subLevel = beforeLevel.substring(before.getLevel().length()); dept.setLevel(after.getLevel() + subLevel); } } Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create(); List<DeptLevelDto> rootDeptList = new ArrayList<>(); rootDeptList.add(after); DeptLevelDto deptDto = null; for (Dept dept : childDeptList) { deptDto = DeptLevelDto.adapt(dept); levelDeptMap.put(dept.getLevel(), deptDto); } deptService.listToTree(rootDeptList, levelDeptMap); System.out.println(new ObjectMapper().writeValueAsString(rootDeptList)); } private List<Dept> getChildLevelDept() { List<Dept> deptList = new ArrayList<>(); Dept dept = new Dept(); dept.setId(5); dept.setParentId(4); dept.setSeq(0); dept.setName("level3.0"); dept.setLevel(LevelUtil.calculateLevel("0.1.2", 4)); deptList.add(dept); dept = new Dept(); dept.setId(6); dept.setParentId(4); dept.setSeq(0); dept.setName("level3.1"); dept.setLevel(LevelUtil.calculateLevel("0.1.2", 4)); deptList.add(dept); return deptList; } private Dept getLevelDeptById(int i) { Dept dept = new Dept(); dept.setId(4); dept.setParentId(2); dept.setSeq(0); dept.setName("level2.0"); dept.setLevel(LevelUtil.calculateLevel("0.1", 2)); return dept; } private static void getLevelDept(DeptService deptService) throws JsonProcessingException { List<Dept> deptList = deptService.getLevelDept(); /** * key是level,value是同一层次的部门对象集合 */ Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create(); List<DeptLevelDto> rootDeptList = new ArrayList<DeptLevelDto>(); DeptLevelDto deptDto = null; for (Dept dept : deptList) { deptDto = DeptLevelDto.adapt(dept); levelDeptMap.put(dept.getLevel(), deptDto); if(deptDto.getLevel().equals(LevelUtil.ROOT)) { rootDeptList.add(deptDto); } } deptService.listToTree(rootDeptList, levelDeptMap); ObjectMapper objectMapper = new ObjectMapper(); String deptTreeJson = objectMapper.writeValueAsString(rootDeptList); System.out.println(deptTreeJson); } /** * 遍历同一层级的dept,从Multimap中拿到其下一集的dept并且放到deptDto的deptList中 * @param parentDeptList * @param root * @param levelDeptMap */ public void listToTree(List<DeptLevelDto> parentDeptList, Multimap<String, DeptLevelDto> levelDeptMap) { List<DeptLevelDto> deptLevelDtoList = null; if(CollectionUtils.isNotEmpty(parentDeptList)) { Collections.sort(parentDeptList, deptSeqComparator); //遍历同一层级的dept for (DeptLevelDto deptLevelDto : parentDeptList) { String parentLevel = deptLevelDto.getLevel(); Integer parentId = deptLevelDto.getId(); deptLev 4000 elDtoList = (List<DeptLevelDto>)levelDeptMap.get(LevelUtil.calculateLevel(parentLevel, parentId)); deptLevelDto.setDeptList(deptLevelDtoList); listToTree(deptLevelDtoList, levelDeptMap); } } } public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() { @Override public int compare(DeptLevelDto o1, DeptLevelDto o2) { return o1.getSeq() - o2.getSeq(); } }; private void testCountLevel() { String calculateLevel = LevelUtil.calculateLevel("1", 1); System.out.println(calculateLevel); } public List<Dept> getLevelDept() { List<Dept> deptList = new ArrayList<Dept>(); Dept dept = new Dept(); dept.setId(1); dept.setParentId(0); dept.setSeq(0); dept.setName("root"); dept.setLevel(LevelUtil.ROOT); deptList.add(dept); dept = new Dept(); dept.setId(2); dept.setParentId(1); dept.setSeq(0); dept.setName("level1.0"); dept.setLevel(LevelUtil.calculateLevel("0", 1)); deptList.add(dept); dept = new Dept(); dept.setId(3); dept.setParentId(1); dept.setSeq(1); dept.setName("level1.1"); dept.setLevel(LevelUtil.calculateLevel("0", 1)); deptList.add(dept); dept = new Dept(); dept.setId(4); dept.setParentId(2); dept.setSeq(0); dept.setName("level2.0"); dept.setLevel(LevelUtil.calculateLevel("0.1", 2)); deptList.add(dept); dept = new Dept(); dept.setId(5); dept.setParentId(4); dept.setSeq(0); dept.setName("level3.0"); dept.setLevel(LevelUtil.calculateLevel("0.1.2", 4)); deptList.add(dept); dept = new Dept(); dept.setId(6); dept.setParentId(4); dept.setSeq(0); dept.setName("level3.1"); dept.setLevel(LevelUtil.calculateLevel("0.1.2", 4)); deptList.add(dept); return deptList; } }源码 http://download.csdn.net/download/u014172271/10268699
相关文章推荐
- javaEE 用户、部门、角色、权限实体的关系设计与hibernate映射配置文件关系总结
- Spring Cloud与微服务学习总结(4)——认证鉴权与API权限控制在微服务架构中的设计与实现(二)
- Spring Cloud与微服务学习总结(6)——认证鉴权与API权限控制在微服务架构中的设计与实现(四)
- 对于C++中公有(public)、私有(private)、保护(protected),访问权限的一点总结
- 基于web信息管理系统的权限设计分析和总结
- Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计
- 对于设计模式之间的选择,可以这样考虑
- 完整的权限管理系统,你有这样完整权限的设计吗?
- 对于权限设计的思路
- Web开发中的用户角色权限设计总结
- 接口加密《二》: API权限设计总结
- 基于web信息管理系统的权限设计分析和总结(数据结构)
- 接口加密《二》: API权限设计总结
- 对于系统权限管理的认识与设计
- 权限设计总结
- Web开发中的用户角色权限设计总结
- 权限设计与总结——用户,角色,权限
- 基于web信息管理系统的权限设计分析和总结(理论)
- 对于俄罗斯方块的方块的设计是这样的。。。