逆向递归加正向递归,将无规则树 重建成一棵完整的树

逆向递归加正向递归,将无规则树 重建成一棵完整的树

背景 后台在一个部门树上 任意勾选,然后前端需要 知道勾选后 重新生成的树,没有父级的 找上级 依次类推。最近递归写的 很多,正向,逆向 各种 操作,(小伙伴觉得很复杂)于是我开始写这个功能,写了3个小时 集中精力。有点小累,差点没写出来。

思路 前端传 选好的 部门列表,后端 根据这些 传过来的 id,逆向递归 找到这个 部门 路径树

1,2,3 这种 拼接好,这样我们就很容易 知道每个部门的层级结构,排在前面的就是父级,

这样 前端的 部门list 就可以 知道 每个 id->path 这种 map,由于 path 里面是完整的路径,我们还需要剔除 没有 选中的 ,这样就能 构建一棵 完整的树了,遍历map,重新构建节点,根据节点构建树。

代码 如下:

public List<Tree<Long>> listDeptTreesByDataScope(List<Long> deptId) {
		Map<String,String> map = new HashMap<>();
		// 获取部门树
		List<Tree<Long>> deptTree = getDeptTree(this.list(Wrappers.emptyWrapper()), 0L);
		for (int i = 0; i < deptId.size(); i++) {
			Long id = deptId.get(i);
			String treePath = getTreePath(deptTree, id);
			// 重新构建路径
			String[] path = treePath.split(",");
			List<String> deptIds = Lists.newArrayList();
			for (int j = 0; j < path.length; j++) {
				String dId = path[j];
				if(deptId.contains(Long.valueOf(dId))){
					deptIds.add(dId);
				}
			}
			String realPath = Joiner.on(",").join(deptIds);
			map.put(String.valueOf(id),realPath);
		}
		// 重构树
		List<TreeNode<Long>> treeList = getTreeList(map,deptTree);
		if(!CollectionUtils.isEmpty(treeList)){
			List<Tree<Long>> trees = TreeUtil.build(treeList, null);
			return trees;
		}
		return Collections.emptyList();
	}
	
	private String getTreePath(List<Tree<Long>> deptTree,Long deptId){
		String path = "";
		for (int i = 0; i < deptTree.size(); i++) {
			Tree<Long> tree = deptTree.get(i);
			if(Objects.equals(tree.getId(),deptId)){
				return String.valueOf(deptId);
			}
			String treePath = buildTreePath(tree.getId(),tree.getChildren(), deptId);
			if(StringUtils.isNotBlank(treePath)){
				return treePath;
			}
		}
		return path;
	}


	private String buildTreePath(Long parentId,List<Tree<Long>> deptTree,Long deptId){
		String path = "";
		if(!CollectionUtils.isEmpty(deptTree)){
			for (int i = 0; i < deptTree.size(); i++) {
				Tree<Long> tree = deptTree.get(i);
				if(Objects.equals(tree.getId(),deptId)){
					return parentId + ","+ tree.getId();
				}
				String treePath = buildTreePath(tree.getId(), tree.getChildren(), deptId);
				if(StringUtils.isNotBlank(treePath)){
					path = parentId+","+treePath;
				}
			}
		}
		return path;
	}
	
	
	private List<TreeNode<Long>> getTreeList(Map<String,String> map,List<Tree<Long>> deptTree){
		List<TreeNode<Long>> treeList = new ArrayList<>();
		for (Map.Entry<String,String> entry:map.entrySet()){

			String value = entry.getValue();
			String[] split = value.split(",");
			if(split.length <= 1){
				TreeNode<Long> tree = new TreeNode<>();
				tree.setId(Long.valueOf(split[0]));
				tree.setParentId(null);
				tree.setWeight(Long.valueOf(split[0]));
				treeList.add(tree);
			}else {
				for (int i = 0; i < split.length-1; i++) {
					TreeNode<Long> tree = new TreeNode<>();
					tree.setId(Long.valueOf(split[i+1]));
					tree.setParentId(Long.valueOf(split[i]));
					tree.setWeight(Long.valueOf(split[i+1]));
					treeList.add(tree);
				}
			}
		}
		// 递归获取名字
		treeList.forEach( e -> e.setName(getTreeName(deptTree,e.getId())));

		return treeList;
	}

总结:有点小叼

posted @ 2022-11-19 18:00  川流不息&  阅读(55)  评论(0编辑  收藏  举报