ツリー構造設計のまとめは、部門のように、権限のように
6961 ワード
1.ツリー構造の三要素:
parentId:親ノードid;
level:設計モードの親ノードのid+level.トップノードのlevelデフォルト値0;
seq:同じレベルでソートします.
2.遍歴:
主な考え方:同じレベルのノードはkeyがlevelのmap構造に保存されます.これによりlevelですべてのサブノードを取得できます.
3.ツリー構造の変更
1はrootノードで、1の下に2つのノード2,3があります.2次にノード4があります.4次にノード5がある.
では、修正ルールは以下の通りです.4を3の下に置きます.4のサブノードのレベルを同時に更新します.
考え方:
(1)更新前の4の情報をそれぞれ表す2つのオブジェクトbefore,afterを作成する.
before:0.1.2 after 0.1.3
(2)beforeのidでParentIdがidであるすべてのサブノードを取得する.
(3)自己集合を遍歴する.
サブノードのレベルの接頭辞をbeforeのレベルを削除した残りは階層内の不動の部分childLevelである.
newLevel = after.getLevel()+childLevel;つまり最新のレベルです.
サブノード5レベル0.1.2.4.変更前の親ノードレベルを削除します.残り4;
4修正後のLevelである0.1.3新しいレベルを生成する:0.1.3.4は最新レベルです.
parentId:親ノードid;
level:設計モードの親ノードのid+level.トップノードのlevelデフォルト値0;
seq:同じレベルでソートします.
2.遍歴:
主な考え方:同じレベルのノードはkeyがlevelのmap構造に保存されます.これによりlevelですべてのサブノードを取得できます.
3.ツリー構造の変更
1はrootノードで、1の下に2つのノード2,3があります.2次にノード4があります.4次にノード5がある.
では、修正ルールは以下の通りです.4を3の下に置きます.4のサブノードのレベルを同時に更新します.
考え方:
(1)更新前の4の情報をそれぞれ表す2つのオブジェクトbefore,afterを作成する.
before:0.1.2 after 0.1.3
(2)beforeのidでParentIdがidであるすべてのサブノードを取得する.
(3)自己集合を遍歴する.
サブノードのレベルの接頭辞をbeforeのレベルを削除した残りは階層内の不動の部分childLevelである.
newLevel = after.getLevel()+childLevel;つまり最新のレベルです.
サブノード5レベル0.1.2.4.変更前の親ノードレベルを削除します.残り4;
4修正後のLevelである0.1.3新しいレベルを生成する:0.1.3.4は最新レベルです.
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 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 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 levelDeptMap = ArrayListMultimap.create();
List 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 getChildLevelDept() {
List 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 deptList = deptService.getLevelDept();
/**
* key level,value
*/
Multimap levelDeptMap = ArrayListMultimap.create();
List rootDeptList = new ArrayList();
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 parentDeptList, Multimap levelDeptMap) {
List deptLevelDtoList = null;
if(CollectionUtils.isNotEmpty(parentDeptList)) {
Collections.sort(parentDeptList, deptSeqComparator);
// dept
for (DeptLevelDto deptLevelDto : parentDeptList) {
String parentLevel = deptLevelDto.getLevel();
Integer parentId = deptLevelDto.getId();
deptLevelDtoList = (List)levelDeptMap.get(LevelUtil.calculateLevel(parentLevel, parentId));
deptLevelDto.setDeptList(deptLevelDtoList);
listToTree(deptLevelDtoList, levelDeptMap);
}
}
}
public Comparator deptSeqComparator = new Comparator() {
@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 getLevelDept() {
List deptList = new ArrayList();
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