package cn.besteam.common.util; import cn.besteam.modules.system.dto.SysDepartmentDTO; import cn.hutool.core.collection.CollectionUtil; import com.google.common.collect.Lists; import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * @author jie * @date 2021/3/9 11:54 */ public class TreeFilterRegionTreeUtil { /** * 获取树状结构 * @param treeList 搜索的树列表 * @param hitIds 命中的ids * @return */ public List searchNode(List treeList, List hitIds) { List filterTree = Lists.newArrayList(); for (SysDepartmentDTO t : treeList) { SysDepartmentDTO node = filterTree(t, hitIds); filterTree.add(node); } return filterTree.stream().filter(Objects::nonNull).collect(Collectors.toList()); } /** * 过滤树 * @param tree * @param hitIds * @return */ private SysDepartmentDTO filterTree(SysDepartmentDTO tree, List hitIds) { /*if(isRemoveNode(tree, hitIds)){ return null; }*/ Iterator iterator = tree.getChildrenList().iterator(); while (iterator.hasNext()){ SysDepartmentDTO child = iterator.next(); deleteNode(child, iterator, hitIds); } return tree; } /** * 删除节点 * @param child * @param iterator * @param hitIds */ private void deleteNode(SysDepartmentDTO child, Iterator iterator, List hitIds) { if(isRemoveNode(child, hitIds)){ iterator.remove(); return; } List childrenList = child.getChildrenList(); if(CollectionUtil.isEmpty(childrenList)){ return; } if(hitIds.contains(child.getId())){ return; } Iterator children = childrenList.iterator(); while (children.hasNext()){ SysDepartmentDTO childChild = children.next(); deleteNode(childChild,children, hitIds); } } /** * 判断该节点是否该删除 * @param root * @param hitIds 命中的节点 * @return ture 需要删除 false 不能被删除 */ private boolean isRemoveNode(SysDepartmentDTO root, List hitIds) { List children = root.getChildrenList(); // 叶子节点 if(CollectionUtil.isEmpty(children)){ return !hitIds.contains(root.getId()); } // 子节点 if(hitIds.contains(root.getId())){ return false; } boolean bool = true; for (SysDepartmentDTO child : children) { if(!isRemoveNode(child,hitIds)){ bool = false; break; } } return bool; } }