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

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

作者: 烟花三月下扬州_2020 | 来源:发表于2024-04-29 11:17 被阅读0次

问题场景的需求描述:

  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;
    }
}

相关文章

  • java集合快速构建成树形json

    1 场景 1.1 面对问题 java中,经常会需要构建树形结构的json,如构建一个省市区的树形结构。 此处情况,...

  • 平级数据转换为树形结构

    /** *该方法用于将有父子关系的数组转换成树形结构的数组 *接收一个具有父子关系的数组作为参数 *返回一个树形结...

  • 多级树形结构和sql查询实现

    文/michaelgbw 多级树形结构是一个应用很广泛的数据结构,程序设计过程中,我们常常用树形结构来表征某些数据...

  • 常用的工具函数

    格式化时间 将url请求参数转为json格式 父子关系的数组转换成树形结构数据 树形结构数据转换成父子关系的数组 ...

  • json杂记

    18.7.221、返回属性结构,只要构建真正的树形结构,然后返回即可。@responseBody会将各种数据结构按...

  • [转]JavaScript将具有父子关系的原始数据格式化成树形结

    前几天遇到一个树型组件(类似树形菜单)数据格式化的问题,由于后台把原始查询的数据直接返回给前端,父子关系并未构建,...

  • PHP 无限极分类

    1.循环迭代实现无限极分类 输出结果如下: 分析:这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算...

  • Java构建树形结构

    前言 平时大概率我们会构建一些树形结果返回给前端,比如菜单结构、部门列表、文件结构等,我们一般想到的就是利用递归来...

  • hashmap的最易懂的讲解,看完立懂

    1、数据结构 1、HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构 2、数组特点...

  • 栈和堆以及栈区和堆区的区别

    栈和堆以及栈区和堆区的区别 数据结构中的栈和堆 栈:具有先进后出性质的数据结构 堆:一种经过排序的树形数据结构,节...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/qrvtfjtx.html