需求:根据所属系统表,查询到某个系统下所有部门信息,部门下面有子部门,子部门下面还有子部门。。。
然后将部门遍历出来,以树节点形式
我们知道用递归也能获得树形结构,但是用循环我觉得更加易懂,可读性会更高
话不多说,直接上代码:
NoteInfo类:
@Data
public class NoteInfo {
//节点ID
private Long id;
//节点标题
private String name;
//子节点信息
private List subNodes;
//角色信息
private List subRoles;
}
两个循环进行遍历就能得结果:
public NoteInfo getNoteTree(Long sysId) {
// 查询出该系统下对应的部门Id
List deptList = deptDao.findBySysId(sysId);
// 定义Map对象
Map noteMap = new HashMap();
NoteInfo root = null;
// 循环将数据解析
for (Dept dept : deptList) {
NoteInfo noteInfo = new NoteInfo();
noteInfo.setId(dept.getId());
noteInfo.setName(dept.getName());
//这里进行初始化list,便于后面写入
noteInfo.setSubRoles(Lists.newArrayList());
//这里进行初始化list,便于后面写入
noteInfo.setSubNodes(Lists.newArrayList());
//列表转化成map,用于后面遍历
noteMap.put(dept.getId(), noteInfo);
}
//最终root就是树形的根节点。
for (Dept dept : deptList) {
NoteInfo curr = noteMap.get(dept.getId());
//父级为空说明该节点为根节点。不为空则说明为子节点
if (dept.getParentId() != null) {
//如果存在父节点,则将找出父节点,并将自己加入父节点中的子节点列表
NoteInfo parent = noteMap.get(dept.getParentId());
parent.getSubNodes().add(curr);
} else {
root = curr;
}
}
//以下同理
List roles = roleDao.findBySysId(sysId);
for (Role role : roles) {
NoteInfo dept = noteMap.get(role.getDeptId());
dept.getSubRoles().add(role);
}
return root;//最终只要返回root就行。
}



