美文网首页
Java扁平数据树型化

Java扁平数据树型化

作者: 大黑跟小白的日常 | 来源:发表于2021-04-01 18:41 被阅读0次
image.png

一个学生碰到的面试题,比较经典,企业使用率较高,这里做一下记录。

具体代码如下

// 业务展示层实体
class DepartmentVO extends Department {
    List<DepartmentVO> departmentVOList;
    public List<DepartmentVO> getDepartmentVOList() {
        return departmentVOList;
    }
    public void setDepartmentVOList(List<DepartmentVO> departmentVOList) {
        this.departmentVOList = departmentVOList;
    }
}
// 数据库实体
class Department {
    private Integer id;
    private String name;
    private Integer pid;
    public Department() {
    }
    public DepartmentVO parse2VO() {
        DepartmentVO departmentVO = new DepartmentVO();
        departmentVO.setName(this.name);
        departmentVO.setId(this.id);
        departmentVO.setPid(this.pid);
        return departmentVO;
    }
    public Department(Integer id, String name, Integer pid) {
        this.id = id;
        this.name = name;
        this.pid = pid;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getPid() {
        return pid;
    }
    public void setPid(Integer pid) {
        this.pid = pid;
    }
}

测试

    public static void main(String[] args) {
        //初始化测试数据
        List<Department> list = new ArrayList<>();
        list.add(new Department(100101, "后台开发部门", 1001));
        list.add(new Department(100102, "前台开发部门", 1001));
        list.add(new Department(100103, "测试部门", 1001));
        list.add(new Department(1001, "研发部", 10));
        list.add(new Department(1002, "财务部", 10));
        list.add(new Department(1003, "人事部", 10));
        list.add(new Department(10, "总裁办", null));
        // ...

        // 获取节点ID及其儿子们的map映射关系,方便后续使用
        HashMap<Integer, List<Department>> map = new HashMap<>();// 父节点id 及父节点下集合 map
        list.forEach(department -> {
            List<Department> departments = map.get(department.getPid());
            if (departments == null) {
                departments = new ArrayList<>();
                map.put(department.getPid(), departments);
            }
            departments.add(department);
        });

        List<Department> rootDepts = map.get(null);
        if(CollectionUtils.isEmpty(rootDepts) || rootDepts.size()>1){
            throw new RuntimeException("数据错误");
        }
        // 获取根节点
        Department department = rootDepts.get(0);
        DepartmentVO rootDept = department.parse2VO();
        // 获取完整根节点(含子项)
        DepartmentVO departmentVO = treeDeptList(rootDept, map);
        System.out.println(departmentVO);
    }

核心方法

     /**
      * @Author G_Y
      * @Description: 根据当前节点 递归获取其子节点并设置其中
      * @Date 2021/4/1 17:22
      * map:// 父节点id 及父节点下集合 的映射 map
      **/
    public static DepartmentVO treeDeptList(DepartmentVO departmentVO, Map<Integer, List<Department>> map) {
        Integer id = departmentVO.getId();// 当前节点id
        List<Department> sons = map.get(id);// 以当前节点id作为父节点的子节点集合
        if (sons == null) {
            // 如果不存在子节点,则不需要再操作
            return departmentVO;
        }
        // 如果存在则需要 将 字节点 加入到 当前节点的 departmentVOList 属性中
        ArrayList<DepartmentVO> departmentVOSList = new ArrayList<>();
        departmentVO.setDepartmentVOList(departmentVOSList);
        for (Department son : sons) {
            DepartmentVO sonVO = son.parse2VO();
            departmentVOSList.add(sonVO);
            // 使用递归 补全 sonVO节点下的 子集合 属性
            sonVO = treeDeptList(sonVO, map);
        }
        return departmentVO;
    }

结果演示


image.png

json转换结果展示:

{
    "id": 10,
    "name": "总裁办",
    "departmentVOList": [{
        "id": 1001,
        "name": "研发部",
        "pid": 10,
        "departmentVOList": [{
            "id": 100101,
            "name": "后台开发部门",
            "pid": 1001
        }, {
            "id": 100102,
            "name": "前台开发部门",
            "pid": 1001
        }, {
            "id": 100103,
            "name": "测试部门",
            "pid": 1001
        }]
    }, {
        "id": 1002,
        "name": "财务部",
        "pid": 10
    }, {
        "id": 1003,
        "name": "人事部",
        "pid": 10
    }]
}

相关文章

  • Java扁平数据树型化

    一个学生碰到的面试题,比较经典,企业使用率较高,这里做一下记录。 具体代码如下 测试 核心方法 结果演示 json...

  • 扁平化后的json根据parentId(父级id,pId) 重组

    扁平化后的数组根据parentId(父级id,pId), 重组成children树型结构

  • 数字格式化

    数字格式化操作主要针对的是浮点型数据,包括double型和float型数据。 在Java中没有格式化的数据遵循以下...

  • java树遍历-递归与非递归(深度优先和广度优先)

    之前写过一个java树迭代的笔记。是将线性结构数据(List)转化为树型结构数据《java 树迭代-反向迭代》。现...

  • Java-泛型

    1、泛型概念 java 泛型,是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被...

  • 2019-01-11

    JAVA泛型 简介: 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定...

  • 列表变树

    需求背景 在需要存储树结构的情况下,一般由于使用的关系型数据库(如 MySQL),是以类似表格的扁平化方式存储数据...

  • serveMap 针对 后台 扁平化 数据作处理

    // 针对 扁平化的 数据 结构 function treeData(source) { //...

  • Kotlin 泛型之类型擦除

    一. Java 泛型的优点 泛型是 Java 5 的重要特性之一。泛型的本质是参数化类型,也就是说所操作的数据类型...

  • 泛型(待补充)

    泛型:参数化类型,对数据类型进行安检。 1.接口,可参考java.lang.Iterable,java.util....

网友评论

      本文标题:Java扁平数据树型化

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