Java 树结构 多级联动 封装对象

问题描述:

完成多层级树结构对象的封装,根据Id,找到所有的子对象,进行封装到一个对象中.

问题细节和需求举例描述:

  1. 问题举例,省级联动中.根据Id找到湖北省这一行信息,而湖北省又有多个市,这些市就是它的子对象,而这些市又有多个镇,这些镇就是市的子对象.

  2. 需求举例:传入湖北省的Id之后,返回的是一个对象,对象中的children成员属性包含湖北省的市,这些市又有多个镇…

  3. 将数据以json格式展示在这里插入图片描述

  4. 在这里插入图片描述

解决思路和代码:

  1. 通过id得到第一层级数据,第二层,第三层级数据
  2. 将获取到层级数据遍历set.
  3. 代码演示
1.
select id,pid,name from organize where pid in (select pid from Table where id in (1)) -- 第一级

select * from Table where pid in (1) -- 第二级

select * from Table where pid in (select id from Table where pid in (1)) -- 第三级

...直到没有数据为止
3.
实体类:
@Data
public class OrganizeWorkMembers {
    private Integer id;
    private Integer pid;
    private String orgName;
    private List<OrganizeWorkMembers> children;
}
实现类:
       //传入的Id
        Integer orgId = Integer.valueOf(String.valueOf(authInfo.getOrgId()));
        //通过传入的Id获得pid
        Integer findPidById = cadreTrainMapper.findPid(orgId);
        //创建list集合存入多个pid
        List<Integer> pid = new ArrayList<>();
        pid.add(findPidById);
        List<Integer> pids = pid;
        List<List<OrganizeWorkMembers>> lists = new ArrayList<>();
        //拿到所有层级的数据
        while (true) {
            List<OrganizeWorkMembers> list = cadreTrainMapper.findOrganizeWorkMembers(pids);
            if (list.size() == 0) {
                break;
            }
            pids.clear();
            lists.add(list);
            for (int i = 0; i < list.size(); i++) {
                pids.add(list.get(i).getId());
            }
        }
        //通过循环setChildren数据
        for (int i = lists.size() - 1; i > 0; i--) {
            for (OrganizeWorkMembers organizeWorkMembers : lists.get(i - 1)) {
                List<OrganizeWorkMembers> list = new ArrayList<>();
                for (OrganizeWorkMembers workMembers : lists.get(i)) {
                    if (workMembers.getPid() == organizeWorkMembers.getId()) {
                        list.add(workMembers);
                    }
                }
                organizeWorkMembers.setChildren(list);
    }
}
//将对象返回
        return lists.get(0).get(0);

返回结果进行校验:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值