Java 树形结构

Posted 赵晓东-Nastu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 树形结构相关的知识,希望对你有一定的参考价值。

基本思路

在开发的时候我们会遇到树状的结构,例如 部门、菜单等信息。

代码

我们先进行数据库中的设计


最重要的是有id和parent_id值,这样部门就可以进行关联了。
实体信息

@Data
public class Department implements Serializable 
  private Integer id;
  private String name;
  private String nameEn;
  private Integer parentId;
  @TableField("`order`")
  private Integer order;
  /**
   * 存储格式英文逗号分隔1,8,9
   */
  private String childIds;
  private Integer createBy;
  private String createDate;
  private Integer updateBy;
  private String updateDate;
  /**
   * 0正常-1删除
   */
  private Integer delFlag;

  @TableField(exist = false)
  List<Department> child = new ArrayList<>();

  private String parentRelation;//父部门简称   
  private String parentRelationIds;//父部门id 链路  1,2,3

  @TableField(exist = false)
  List<User> userList = new ArrayList<>();

  public Department(Integer id) 
    this.id = id;
  
  public Department() 
  

Controller

  @GetMapping("/deptTreeUser")
  public ApiResponse<Department> deptTreeUser(Integer id) 
    return ApiResponse.success(departmentService.deptTreeUser(id));
  

Service

  public Department deptTree(Integer deptRootId) 
    if (deptRootId == null) 
      return deptTree();
    
    //order只是保证了同级部门之间的相对顺序
    List<Department> departmentList = listByCache().stream().sorted(Comparator.comparing(v -> v.getOrder())).collect(Collectors.toList());
    Department root = departmentList.stream().filter(v -> v.getId().equals(deptRootId)).findFirst().get();
    root.setChild(departmentList.stream().filter(v -> v.getParentId().equals(root.getId())).collect(Collectors.toList()));
    return getDepartments(departmentList,root.getChild(), root);
  

这个方法的目的是从数据库中查询出部门信息后,将信息按照order进行排序构建树,然后查询出它的子部门

listByCache方法

  private List<Department> listByCache() 
    List<Department> departmentList=redisTemplate.opsForList().range(DEPARTMENT_KEY,0,-1);
    if (CollectionUtil.isEmpty(departmentList)) 
    // 获取所有部门的信息
      departmentList = list();
      redisTemplate.opsForList().leftPushAll(DEPARTMENT_KEY, departmentList);
    
    return departmentList;
  

这个方法的目的就是从数据库中查询部门信息

  private Department getDepartments(List<Department> departmentAllList,List<Department> departmentList, Department root) 
    if (CollectionUtil.isNotEmpty(departmentList)) 
      for (Department department : departmentList) 
        List<Department> tempList2 = departmentAllList.stream().filter(v -> v.getParentId().equals(department.getId())).collect(Collectors.toList());
        department.setChild(tempList2);
        getDepartments(departmentAllList, tempList2, department);
      
    
    return root;
  

这个方法的目的就是构建树,构建子部门的树。这样返回root就可以把部门按照树形的结构进行展示了。

扩展

如果我们想在相应的部门下面进行添加人员呢?
这个时候,我们我们只需要在部门实体里面增加上

  @TableField(exist = false)
  List<User> userList = new ArrayList<>();

这个字段,然后通过遍历,将用户的信息添加进去即可。

获取所有的用户信息

  public Department deptTreeUser(Integer deptRootId) 
    Department department=deptTree(deptRootId);
    List<User> list= userDepartmentService.listUserByLocal();
    addUserForDept(department.getChild(), list);
    department.setUserList(list.stream().filter(v -> v.getMainDepartment().equals(department.getId())).collect(Collectors.toList()));
    return department;
  
  private void addUserForDept(List<Department> child, List<User> list) 
  for (Department department : child) 
    List<User> tempList=list.stream().filter(v -> v.getMainDepartment().equals(department.getId())).collect(Collectors.toList());
    department.setUserList(tempList);
    addUserForDept(department.getChild(), list);
  

以上是关于Java 树形结构的主要内容,如果未能解决你的问题,请参考以下文章

如何用Java实现树形结构啊?

《Java数据结构》树形结构

Java 树形结构

java中树形结构怎么实现

Java接口返回省市区树形结构

java web 树形结构设计