Java 树结构 多级联动 封装对象
问题描述:
完成多层级树结构对象的封装,根据Id,找到所有的子对象,进行封装到一个对象中.
问题细节和需求举例描述:
-
问题举例,省级联动中.根据Id找到湖北省这一行信息,而湖北省又有多个市,这些市就是它的子对象,而这些市又有多个镇,这些镇就是市的子对象.
-
需求举例:传入湖北省的Id之后,返回的是一个对象,对象中的children成员属性包含湖北省的市,这些市又有多个镇…
-
将数据以json格式展示
解决思路和代码:
- 通过id得到第一层级数据,第二层,第三层级数据
- 将获取到层级数据遍历set.
- 代码演示
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);