/** * 构建树 * @param nodes * @return */ private List<DepartmentUsersDTO> generateTree(List<DepartmentUsersDTO> nodes) { Deque<DepartmentUsersDTO> deque = new LinkedList<>(nodes); List<DepartmentUsersDTO> tree = new ArrayList<>(); Set<DepartmentUsersDTO> duplicate = new HashSet<>(nodes); while (!deque.isEmpty()) { DepartmentUsersDTO poll = deque.pollFirst(); DepartmentUsersDTO parent; if (poll.getParentId() == null) { tree.add(poll); } else if (Objects.nonNull(parent = dfs(tree, poll.getParentId()))) { List<DepartmentUsersDTO> children = parent.getChildren(); children.add(poll); } else { deque.addFirst(poll); // 根据parent id查父节点 DepartmentDetailRespDTO data = departmentService.getDepartmentDetail(poll.getParentId()).getData(); DepartmentUsersDTO departmentUsersDTO = new DepartmentUsersDTO(); BeanUtil.copyProperties(data,departmentUsersDTO); if (duplicate.add(departmentUsersDTO)) { deque.addFirst(departmentUsersDTO); } } } return tree; } /** * 寻找父节点 * @param treeNodes * @param id * @return */ private DepartmentUsersDTO dfs(List<DepartmentUsersDTO> treeNodes, Integer id) { DepartmentUsersDTO result; for (DepartmentUsersDTO e : treeNodes) { if (Objects.equals(e.getId(), id)) { return e; } if (CollectionUtils.isNotEmpty(e.getChildren())) { result = dfs(e.getChildren(), id); if (Objects.nonNull(result)) { return result; } } } return null; }
构建树中间出现断层的解决方案
于 2023-08-22 10:47:49 首次发布