Java程序设计典型场景:构建具有无限父子关系的树形数据结构

2024-04-29  本文已影响0人  烟花三月下扬州_2020

问题场景的需求描述:

  1. 根据数据库中具有父子关系的部门数据,构建一个树形的数据结构。
  2. 部门层级不确定。
  3. 采用递归方法来实现。
  4. 执行效率高。
  5. Java代码实现。
    说明:豆包大语言模型生成如下Java示例代码,不保证如下代码能够正常无误运行,主要提供此类问题的程序设计思路,抛转引玉。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Department {
    private int id;
    private String name;
    private Department parent;
    private List<Department> children;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
        this.children = new ArrayList<>();
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public Department getParent() {
        return parent;
    }

    public void setParent(Department parent) {
        this.parent = parent;
    }

    public List<Department> getChildren() {
        return children;
    }

    public void addChild(Department child) {
        children.add(child);
    }

    public static Department buildTree(List<Department> departments) {
        Map<Integer, Department> departmentMap = new HashMap<>();

        for (Department department : departments) {
            departmentMap.put(department.getId(), department);
        }

        return buildTreeRecursive(departmentMap, null);
    }

    private static Department buildTreeRecursive(Map<Integer, Department> departmentMap, Department parent) {
        List<Department> children = new ArrayList<>();

        for (Department department : departmentMap.values()) {
            if (department.getParent() == parent) {
                children.add(department);
                department.setParent(parent);
            }
        }

        Department currentDepartment;

        if (parent == null) {
            currentDepartment = departmentMap.get(children.get(0).getId());
        } else {
            currentDepartment = parent;
        }

        for (Department child : children) {
            currentDepartment.addChild(buildTreeRecursive(departmentMap, child));
        }

        return currentDepartment;
    }
}

推荐:项目实战应用中推荐使用更加灵活的Java最好用的开源三方脚手架Hutool:
树结构工具-TreeUtil

已读懂上面代码的同学请忽略以下内容,有疑问的同学,请阅读下面增加注释说明代码,希望能对你有帮助:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Department {
    // 部门的 ID
    private int id;
    // 部门的名称
    private String name;
    // 部门的父部门
    private Department parent;
    // 部门的子部门列表
    private List<Department> children;

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
        this.children = new ArrayList<>();
    }

    // 获取部门的 ID
    public int getId() {
        return id;
    }

    // 获取部门的名称
    public String getName() {
        return name;
    }

    // 获取部门的父部门
    public Department getParent() {
        return parent;
    }

    // 设置部门的父部门
    public void setParent(Department parent) {
        this.parent = parent;
    }

    // 获取部门的子部门列表
    public List<Department> getChildren() {
        return children;
    }

    // 向子部门列表中添加子部门
    public void addChild(Department child) {
        children.add(child);
    }

    // 构建树形结构的方法
    public static Department buildTree(List<Department> departments) {
        // 用于存储部门的映射
        Map<Integer, Department> departmentMap = new HashMap<>();

        for (Department department : departments) {
            // 将部门添加到映射中
            departmentMap.put(department.getId(), department);
        }

        // 递归构建树形结构的方法
        return buildTreeRecursive(departmentMap, null);
    }

    // 递归构建树形结构的具体实现
    private static Department buildTreeRecursive(Map<Integer, Department> departmentMap, Department parent) {
        // 子部门列表
        List<Department> children = new ArrayList<>();

        for (Department department : departmentMap.values()) {
            // 如果部门的父部门是指定的父部门
            if (department.getParent() == parent) {
                // 将其添加到子部门列表中
                children.add(department);
                // 设置部门的父部门
                department.setParent(parent);
            }
        }

        // 当前部门
        Department currentDepartment;

        if (parent == null) {
            // 如果父部门为空,则获取子部门列表中的第一个部门作为当前部门
            currentDepartment = departmentMap.get(children.get(0).getId());
        } else {
            // 否则,将父部门作为当前部门
            currentDepartment = parent;
        }

        for (Department child : children) {
            // 递归添加子部门
            currentDepartment.addChild(buildTreeRecursive(departmentMap, child));
        }

        return currentDepartment;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读