ツリー構造設計のまとめは、部門のように、権限のように

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は最新レベルです.
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