注意:这里用的是2020年6月中华人民共和国县以上行政区划代码
省市区树形结构递归查询:
public ResultBean getTree() {
return ResultBean.ok(getList());
}
private List<SysDictTabVo> getList() {
//1.查出数据字典表中的所有数据
List<SysDictTab> list = sysDictTabMapper.findAll();
//2.将数据库中的数据填充到vo中
List<SysDictTabVo> vos = new ArrayList<>();
if (null != list && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
SysDictTabVo vo = new SysDictTabVo();
SysDictTab sysDictTab = list.get(i);
vo.setId(sysDictTab.getId());
vo.setName(sysDictTab.getName());
vo.setCode(sysDictTab.getCode());
vo.setPid(sysDictTab.getPid());
vos.add(vo);
}
}
List<SysDictTabVo> returnList = new ArrayList<>();
if (null != vos && vos.size() > 0) {
//3.获取数据库中的id集合
List<Long> idList = vos.stream().map(SysDictTabVo::getId).collect(Collectors.toList());
//4.递归添加数据到集合中
for (Iterator<SysDictTabVo> iterator = vos.iterator(); iterator.hasNext();) {
SysDictTabVo sysDictTabVo = iterator.next();
if (!idList.contains(sysDictTabVo.getPid())) {
recursionFn(vos, sysDictTabVo);
returnList.add(sysDictTabVo);
}
}
}
if (returnList.isEmpty()) {
returnList = vos;
}
return returnList;
}
private void recursionFn (List<SysDictTabVo> list, SysDictTabVo t) {
//获取子集并赋值
List<SysDictTabVo> childList = getChildList(list, t);
t.setChildren(childList);
for (SysDictTabVo tChild : childList) {
if (hasChild(list, tChild)) {
//子集继续递归至无子集
recursionFn(list, tChild);
}
}
}
private boolean hasChild (List<SysDictTabVo> list, SysDictTabVo t) {
return getChildList(list, t).size() > 0 ? true : false;
}
private List<SysDictTabVo> getChildList (List<SysDictTabVo> list, SysDictTabVo t) {
List<SysDictTabVo> tlist = new ArrayList<>();
Iterator<SysDictTabVo> it = list.iterator();
while(it.hasNext()) {
SysDictTabVo n = it.next();
if (n.getPid() != null) {
if (n.getPid().equals(t.getId())) {
tlist.add(n);
}
}
}
return tlist;
}
//展示数据结构
@Data
public class SysDictTabVo {
private Long id;
private String name;
private String code;
private Long pid;
private List<SysDictTabVo> children;
}
//实体类
@Data
public class SysDictTab {
private Long id;
private String code;
private String name;
private Long pid;
}
响应结果:
