/**
* 建立树形结构
*
* @param menuList
* @return
*/
private List<PpmProjectDto> buildTree(List<PpmProjectDto> menuList) {
List<PpmProjectDto> treeMenus = new ArrayList<PpmProjectDto>();
for (PpmProjectDto menuNode : getRootNode(menuList)) {
buildChildTree(menuList, menuNode);
treeMenus.add(menuNode);
}
return treeMenus;
}
/**
* 获取根节点
*
* @param menuList
* @return
*/
private List<PpmProjectDto> getRootNode(List<PpmProjectDto> menuList) {
List<PpmProjectDto> rootMenuLists = new ArrayList<PpmProjectDto>();
for (PpmProjectDto menuNode : menuList) {
if (menuNode.getParentId().equals(-1L)) {
rootMenuLists.add(menuNode);
}
}
return rootMenuLists;
}
/**
* 递归,建立子树形结构
*
* @param menuList
* @param pNode
* @return
*/
private PpmProjectDto buildChildTree(List<PpmProjectDto> menuList, PpmProjectDto pNode) {
List<PpmProjectDto> childMenus = new ArrayList<PpmProjectDto>();
for (PpmProjectDto menuNode : menuList) {
if (menuNode.getParentId().equals(pNode.getProjectId())) {
childMenus.add(buildChildTree(menuList, menuNode));
}
}
pNode.setChildren(childMenus);
return pNode;
}
再通过树结构去模糊查询
第一种:查询精确的某个名称
/**
* 再通过树结构去模糊查询
*
* @param data
* @param keyword
* @return
*/
private List<TreeDto> filterTreeByKeyWord(List<TreeDto> data, String keyword) {
if (CollectionUtils.isEmpty(data)) {
return data;
}
filter(data, keyword);
return data;
}
/**
* 递归方法
*
* @param list 任意层级的节点
* @param keyword 关键字
*/
private void filter(List<TreeDto> list, String keyword) {
Iterator<TreeDto> parent = list.iterator();
while (parent.hasNext()) {
//当前节点
TreeDto t = parent.next();
if (StrUtil.isNotEmpty(keyword) && !t.getName().contains(keyword)) {
//当前节点不包含关键字,继续遍历下一级
// 取出下一级节点
List<TreeDto> children = t.getChildren();
// 递归
if (!CollectionUtils.isEmpty(children)) {
filter(children, keyword);
}
//下一级节点都被移除了,那么父节点也移除,因为父节点也不包含关键字
if (CollectionUtils.isEmpty(t.getChildren())) {
parent.remove();
}
} else {
//当前节点包含关键字,继续递归遍历
//子节点递归如果不包含关键字则会进入if分支被删除
List<TreeDto> children = t.getChildren();
// 递归
if (!CollectionUtils.isEmpty(children)) {
filter(children, keyword);
}
}
}
}
第二种:支持查询菜单和名字,查询菜单时支持下拉
/**
* 再通过树结构去模糊查询
*
* @param data
* @param keyword
* @return
*/
private List<PpmProjectDto> filterTreeByName(List<PpmProjectDto> data, String keyword) {
if (CollectionUtils.isEmpty(data)) {
return data;
}
filter(data, keyword, null);
return data;
}
/**
* 递归方法
*
* @param list 任意层级的节点
* @param keyword 关键字
* @param parentId 父ID
*/
private void filter(List<PpmProjectDto> list, String keyword, Long parentId) {
Iterator<PpmProjectDto> parent = list.iterator();
while (parent.hasNext()) {
//当前节点
PpmProjectDto t = parent.next();
if (StrUtil.isNotEmpty(keyword) && !t.getProjectName().contains(keyword)) {
//当前节点不包含关键字,继续遍历下一级
// 取出下一级节点
List<PpmProjectDto> children = t.getChildren();
// 递归
if (!CollectionUtils.isEmpty(children)) {
filter(children, keyword, null);
}
//下一级节点都被移除了,那么父节点也移除,因为父节点也不包含关键字
if (CollectionUtils.isEmpty(t.getChildren()) && !t.getParentId().equals(-1L) && !t.getParentId().equals(parentId)) {
parent.remove();
}
} else {
//当前节点包含关键字,继续递归遍历
//子节点递归如果不包含关键字则会进入if分支被删除
List<PpmProjectDto> children = t.getChildren();
// 递归
if (!org.springframework.util.CollectionUtils.isEmpty(children)) {
filter(children, keyword, t.getProjectId());
}
}
}
}