特定の人員と部門のツリーデータに対して、新しいツリーデータの構想を再分割して構築します.

19072 ワード

クラスを新規作成java.
次のクラスを参照すると、ツリーデータ構造フロントに必要な新しいツリーデータを再分割できます.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;

public class RecursiveRescreening {

	public static void main(String[] args) {
		String jsonStr = "[{\"num\":\"1000\",\"name\":\"*******      \",\"superiorDept\":\"-1\",\"leaderPerNums\":[],\"children\":[{\"num\":\"101\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\",\"6\"],\"children\":[{\"num\":\"3\",\"name\":\"     \"},{\"num\":\"4\",\"name\":\"  11 \"},{\"num\":\"5\",\"name\":\"   \"},{\"num\":\"6\",\"name\":\"   \"},{\"num\":\"7\",\"name\":\"  11 \"},{\"num\":\"8\",\"name\":\"   \"},{\"num\":\"9\",\"name\":\"   \"},{\"num\":\"10\",\"name\":\"  \"},{\"num\":\"11\",\"name\":\"   \"},{\"num\":\"42\",\"name\":\"   \"},{\"num\":\"64\",\"name\":\"   \"},{\"num\":\"65\",\"name\":\"  1 \"},{\"num\":\"66\",\"name\":\"   \"}]},{\"num\":\"102\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"12\",\"name\":\"  1 \"},{\"num\":\"13\",\"name\":\"   \"},{\"num\":\"14\",\"name\":\"  1 \"},{\"num\":\"15\",\"name\":\"   \"},{\"num\":\"16\",\"name\":\"   \"},{\"num\":\"17\",\"name\":\"   \"},{\"num\":\"18\",\"name\":\"  \"},{\"num\":\"51\",\"name\":\" 1  \"},{\"num\":\"58\",\"name\":\"  \"},{\"num\":\"59\",\"name\":\"   \"},{\"num\":\"73\",\"name\":\"  \"},{\"num\":\"74\",\"name\":\"  \"}]},{\"num\":\"103\",\"name\":\"    \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"20\"],\"children\":[{\"num\":\"20\",\"name\":\"   \"},{\"num\":\"21\",\"name\":\"  \"},{\"num\":\"22\",\"name\":\"   \"},{\"num\":\"23\",\"name\":\"   \"},{\"num\":\"24\",\"name\":\"   \"},{\"num\":\"25\",\"name\":\"   \"},{\"num\":\"26\",\"name\":\"   \"},{\"num\":\"27\",\"name\":\"  \"},{\"num\":\"28\",\"name\":\"   \"},{\"num\":\"29\",\"name\":\"   \"},{\"num\":\"49\",\"name\":\"  \"},{\"num\":\"52\",\"name\":\"  \"},{\"num\":\"53\",\"name\":\"   \"},{\"num\":\"55\",\"name\":\"   \"},{\"num\":\"56\",\"name\":\"   \"},{\"num\":\"57\",\"name\":\"   \"},{\"num\":\"60\",\"name\":\"   \"},{\"num\":\"61\",\"name\":\"  \"},{\"num\":\"62\",\"name\":\"   \"},{\"num\":\"63\",\"name\":\"   \"},{\"num\":\"69\",\"name\":\"  \"},{\"num\":\"70\",\"name\":\"  \"},{\"num\":\"72\",\"name\":\"   \"},{\"num\":\"76\",\"name\":\"   \"},{\"num\":\"77\",\"name\":\"   \"}]},{\"num\":\"104\",\"name\":\"    \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"30\"],\"children\":[{\"num\":\"30\",\"name\":\"   \"},{\"num\":\"31\",\"name\":\"   \"},{\"num\":\"32\",\"name\":\"   \"},{\"num\":\"33\",\"name\":\"  \"},{\"num\":\"34\",\"name\":\"   \"},{\"num\":\"35\",\"name\":\"   \"},{\"num\":\"36\",\"name\":\"   \"},{\"num\":\"37\",\"name\":\"   \"},{\"num\":\"38\",\"name\":\"  \"},{\"num\":\"39\",\"name\":\"   \"},{\"num\":\"40\",\"name\":\"   \"},{\"num\":\"41\",\"name\":\"  \"},{\"num\":\"67\",\"name\":\"   \"},{\"num\":\"68\",\"name\":\"  \"},{\"num\":\"75\",\"name\":\"   \"}]},{\"num\":\"105\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\"],\"children\":[{\"num\":\"43\",\"name\":\"  \"},{\"num\":\"44\",\"name\":\"   \"},{\"num\":\"71\",\"name\":\"   \"}]},{\"num\":\"106\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"2\",\"name\":\"   \"},{\"num\":\"45\",\"name\":\"   \"},{\"num\":\"46\",\"name\":\"  \"},{\"num\":\"47\",\"name\":\"   \"},{\"num\":\"48\",\"name\":\"  \"},{\"num\":\"50\",\"name\":\"  \"},{\"num\":\"54\",\"name\":\"   \"}]},{\"num\":\"1001\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[],\"children\":[{\"num\":\"1\",\"name\":\"   \"}]}]}]";
		new RecursiveRescreening().rescreeningDeptAndPersonTree(jsonStr);
	}

	/**
	 * String jsonStr
	 * ="[{\"num\":\"1000\",\"name\":\"*******      \",\"superiorDept\":\"-1\",\"leaderPerNums\":[],\"children\":[{\"num\":\"101\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\",\"6\"],\"children\":[{\"num\":\"3\",\"name\":\"   \"},{\"num\":\"4\",\"name\":\"   \"},{\"num\":\"5\",\"name\":\"   \"},{\"num\":\"6\",\"name\":\"   \"},{\"num\":\"7\",\"name\":\"   \"},{\"num\":\"8\",\"name\":\"   \"},{\"num\":\"9\",\"name\":\"   \"},{\"num\":\"10\",\"name\":\"  \"},{\"num\":\"11\",\"name\":\"   \"},{\"num\":\"42\",\"name\":\"   \"},{\"num\":\"64\",\"name\":\"   \"},{\"num\":\"65\",\"name\":\"   \"},{\"num\":\"66\",\"name\":\"   \"}]},{\"num\":\"102\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"12\",\"name\":\"   \"},{\"num\":\"13\",\"name\":\"   \"},{\"num\":\"14\",\"name\":\"   \"},{\"num\":\"15\",\"name\":\"   \"},{\"num\":\"16\",\"name\":\"   \"},{\"num\":\"17\",\"name\":\"   \"},{\"num\":\"18\",\"name\":\"  \"},{\"num\":\"51\",\"name\":\"   \"},{\"num\":\"58\",\"name\":\"  \"},{\"num\":\"59\",\"name\":\"   \"},{\"num\":\"73\",\"name\":\"  \"},{\"num\":\"74\",\"name\":\"  \"}]},{\"num\":\"103\",\"name\":\"    \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"20\"],\"children\":[{\"num\":\"20\",\"name\":\"   \"},{\"num\":\"21\",\"name\":\"  \"},{\"num\":\"22\",\"name\":\"   \"},{\"num\":\"23\",\"name\":\"   \"},{\"num\":\"24\",\"name\":\"   \"},{\"num\":\"25\",\"name\":\"   \"},{\"num\":\"26\",\"name\":\"   \"},{\"num\":\"27\",\"name\":\"  \"},{\"num\":\"28\",\"name\":\"   \"},{\"num\":\"29\",\"name\":\"   \"},{\"num\":\"49\",\"name\":\"  \"},{\"num\":\"52\",\"name\":\"  \"},{\"num\":\"53\",\"name\":\"   \"},{\"num\":\"55\",\"name\":\"   \"},{\"num\":\"56\",\"name\":\"   \"},{\"num\":\"57\",\"name\":\"   \"},{\"num\":\"60\",\"name\":\"   \"},{\"num\":\"61\",\"name\":\"  \"},{\"num\":\"62\",\"name\":\"   \"},{\"num\":\"63\",\"name\":\"   \"},{\"num\":\"69\",\"name\":\"  \"},{\"num\":\"70\",\"name\":\"  \"},{\"num\":\"72\",\"name\":\"   \"},{\"num\":\"76\",\"name\":\"   \"},{\"num\":\"77\",\"name\":\"   \"}]},{\"num\":\"104\",\"name\":\"    \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"30\"],\"children\":[{\"num\":\"30\",\"name\":\"   \"},{\"num\":\"31\",\"name\":\"   \"},{\"num\":\"32\",\"name\":\"   \"},{\"num\":\"33\",\"name\":\"  \"},{\"num\":\"34\",\"name\":\"   \"},{\"num\":\"35\",\"name\":\"   \"},{\"num\":\"36\",\"name\":\"   \"},{\"num\":\"37\",\"name\":\"   \"},{\"num\":\"38\",\"name\":\"  \"},{\"num\":\"39\",\"name\":\"   \"},{\"num\":\"40\",\"name\":\"   \"},{\"num\":\"41\",\"name\":\"  \"},{\"num\":\"67\",\"name\":\"   \"},{\"num\":\"68\",\"name\":\"  \"},{\"num\":\"75\",\"name\":\"   \"}]},{\"num\":\"105\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"42\"],\"children\":[{\"num\":\"43\",\"name\":\"  \"},{\"num\":\"44\",\"name\":\"   \"},{\"num\":\"71\",\"name\":\"   \"}]},{\"num\":\"106\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[\"2\"],\"children\":[{\"num\":\"2\",\"name\":\"   \"},{\"num\":\"45\",\"name\":\"   \"},{\"num\":\"46\",\"name\":\"  \"},{\"num\":\"47\",\"name\":\"   \"},{\"num\":\"48\",\"name\":\"  \"},{\"num\":\"50\",\"name\":\"  \"},{\"num\":\"54\",\"name\":\"   \"}]},{\"num\":\"1001\",\"name\":\"   \",\"superiorDept\":\"1000\",\"leaderPerNums\":[],\"children\":[{\"num\":\"1\",\"name\":\"   \"}]}]}]";
	 * 
	 * @param jsonStr
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List> rescreeningDeptAndPersonTree(String jsonStr) {
		List> resultList = new ArrayList<>();
		try {
			List> list = JSON.parseObject(jsonStr, List.class);
			//       
			List> allDeptMapList = new ArrayList<>();
			//       
			List> allPersonMapList = new ArrayList<>();
			degui(list, allDeptMapList, allPersonMapList);
			System.out.println(allDeptMapList);
			System.out.println(allPersonMapList);
			//         map  
			Map deptNumAndDeptNameMap = new HashMap<>();
			for (Map deptMap : allDeptMapList) {
				deptNumAndDeptNameMap.put((String) deptMap.get("num"), (String) deptMap.get("name"));
			}
			//             。
			List deptNumList = new ArrayList<>();
			for (Map deptMap : allDeptMapList) {
				String deptNum = (String) deptMap.get("num");
				if ((boolean) deptMap.get("disabled")) {
					continue;
				}
				boolean isParentFlag = false;
				for (Map twoLeveldeptMap : allDeptMapList) {
					if (((String) twoLeveldeptMap.get("superiorDept")).equals(deptNum)) {
						isParentFlag = true;
						break;
					}
				}
				if (!isParentFlag) {
					deptNumList.add(deptNum);
				}
			}
			//             
			for (String deptNum : deptNumList) {
				Map deptMap = new HashMap<>();
				//      
				deptMap.put("num", deptNum);
				List tmpDetpNumList = new ArrayList<>();
				//               (    )
				getAllDeptNumList(deptNum, allDeptMapList, tmpDetpNumList);
				List realDeptNumList = new ArrayList<>();
				//       (          )
				for (int i = tmpDetpNumList.size() -2;i >= 0; i--) {
					System.out.println("tmpDetpNumList.get(i):" + tmpDetpNumList.get(i));
					realDeptNumList.add(tmpDetpNumList.get(i));
				}
				System.out.println("realDeptNumList" + realDeptNumList);
				//                  
				String name = "";
				for (int i = 0; i < realDeptNumList.size(); i++) {
					String num = realDeptNumList.get(i);
					if (i == realDeptNumList.size() - 1) {
						name = name + deptNumAndDeptNameMap.get(num);
					} else {
						name = name + deptNumAndDeptNameMap.get(num) + "/";
					}
				}
				deptMap.put("name", name);
				List> deptPersonMapList = new ArrayList<>();
				//        list
				for (Map personMap : allPersonMapList) {
					if (((String) personMap.get("deptNum")).equals(deptNum)) {
						deptPersonMapList.add(personMap);
					}
				}
				deptMap.put("children",deptPersonMapList);
				resultList.add(deptMap);
			}
		} catch (Exception e) {
			resultList = new ArrayList<>();
			e.printStackTrace();
		}
		System.out.println(resultList);
		System.out.println(JSON.toJSONString(resultList));
		return resultList;
	}

	/**
	 *                       List
	 * 
	 * @param list
	 * @param allDeptMapList
	 * @param allPersonMapList
	 */
	@SuppressWarnings("unchecked")
	public static void degui(List> list, List> allDeptMapList,
			List> allPersonMapList) {
		String deptNum = "";
		if (allDeptMapList != null && allDeptMapList.size() > 0) {
			deptNum = (String) allDeptMapList.get(allDeptMapList.size() - 1).get("num");
		}
		for (Map map : list) {
			String num = (String) map.get("num");
			String name = (String) map.get("name");
			if (map.get("leaderPerNums") != null && map.get("children") != null) {//          
				Map deptMap = new HashMap<>();
				String superiorDept = (String) map.get("superiorDept");
				deptMap.put("num", num);
				deptMap.put("name", name);
				deptMap.put("superiorDept", superiorDept);
				deptMap.put("disabled", false);
				allDeptMapList.add(deptMap);
				degui((List>) map.get("children"), allDeptMapList, allPersonMapList);
			}
			if (map.get("leaderPerNums") != null && map.get("children") == null) {//           
				Map deptMap = new HashMap<>();
				String superiorDept = (String) map.get("superiorDept");
				deptMap.put("num", num);
				deptMap.put("name", name);
				deptMap.put("superiorDept", superiorDept);
				deptMap.put("disabled", true);
				allDeptMapList.add(deptMap);
			}
			if (map.get("leaderPerNums") == null && map.get("children") == null) {//  
				Map personMap = new HashMap<>();
				personMap.put("num", num);
				personMap.put("name", name);
				personMap.put("deptNum", deptNum);
				allPersonMapList.add(personMap);
			}
		}
	}

	/**
	 *              
	 * 
	 * @param deptNum
	 * @param allDeptMapList
	 * @param tmpDeptNumList
	 */
	public static void getAllDeptNumList(String deptNum, List> allDeptMapList,
			List tmpDeptNumList) {
		tmpDeptNumList.add(deptNum);
		for (Map deptMap : allDeptMapList) {
			String superiorDept = (String) deptMap.get("superiorDept");
			if ((deptNum.equals((String) deptMap.get("num"))) && (!"-1".equals(superiorDept))) {
				getAllDeptNumList(superiorDept, allDeptMapList, tmpDeptNumList);
			}
		}
		return;
	}
}