通过栈实现树状结构List的查找和遍历
public List<TreeNodeDO> selectOrganizationTree(List<TreeNodeDO> nodeList) {
Map<Long, List<TreeNodeDO>> groupMap = nodeList.stream().collect(Collectors.groupingBy(TreeNodeDO::getParentId));
nodeList.forEach(organization-> {
organization.setChildren(groupMap.get(organization.getId()));
});
List<TreeNodeDO> collect = nodeList.stream().filter(organization-> organization.getParentId().equals(0L)).collect(Collectors.toList());
return collect;
}
/**
* 通过栈方式获取树形结构中指定的树节点
*
* @param nodeDOList
* @param dicCode
* @return
*/
private TreeNodeDO getTreeNodeDO(List<TreeNodeDO> nodeDOList, String dicCode) {
Stack<List<TreeNodeDO>> stack = new Stack<>();
stack.push(nodeDOList);
while (!stack.isEmpty()) {
List<TreeNodeDO> list = stack.pop();
for (TreeNodeDO nodeDO : list) {
if (nodeDO.getCode().equals(dicCode)) {
return nodeDO;
}
if (CollectionUtils.isNotEmpty(nodeDO.getChildren())) {
stack.push(nodeDO.getChildren());
}
}
}
return null;
}
/**
* 通过栈方式提取树形结构中树节点转为map
*
* @param nodeDOList
* @param map
* @return
*/
private void getTreeNodeDOMap(List<TreeNodeDO> nodeDOList, Map<String, String> map) {
Stack<List<TreeNodeDO>> stack = new Stack<>();
stack.push(nodeDOList);
while (!stack.isEmpty()) {
List<TreeNodeDO> list = stack.pop();
for (TreeNodeDO nodeDO : list) {
map.put(nodeDO.getCode(), nodeDO.getName());
if (CollectionUtils.isNotEmpty(nodeDO.getChildren())) {
stack.push(nodeDO.getChildren());
}
}
}
}