package cn.besteam.common.util; import cn.besteam.modules.system.vo.SysDepartmentCascadeVO; 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 TreeFilterModelSysDepartmentCascadeUtil{ /** * 获取树状结构 * @param treeList 搜索的树列表 * @param hitIds 命中的ids * @return */ public List searchNode(List treeList, List hitIds) { List filterTree = Lists.newArrayList(); for (SysDepartmentCascadeVO t : treeList) { SysDepartmentCascadeVO node = filterTree(t, hitIds); filterTree.add(node); } return filterTree.stream().filter(Objects::nonNull).collect(Collectors.toList()); } /** * 过滤树 * @param tree * @param hitIds * @return */ private SysDepartmentCascadeVO filterTree(SysDepartmentCascadeVO tree, List hitIds) { /*if(isRemoveNode(tree, hitIds)){ return null; }*/ Iterator iterator = tree.getChildren().iterator(); while (iterator.hasNext()){ SysDepartmentCascadeVO child = iterator.next(); deleteNode(child, iterator, hitIds); } return tree; } /** * 删除节点 * @param child * @param iterator * @param hitIds */ private void deleteNode(SysDepartmentCascadeVO child, Iterator iterator, List hitIds) { if(isRemoveNode(child, hitIds)){ iterator.remove(); return; } List childrenList = child.getChildren(); if(CollectionUtil.isEmpty(childrenList)){ return; } if(hitIds.contains(Integer.valueOf(child.getValue()))){ return; } Iterator children = childrenList.iterator(); while (children.hasNext()){ SysDepartmentCascadeVO childChild = children.next(); deleteNode(childChild,children, hitIds); } } /** * 判断该节点是否该删除 * @param root * @param hitIds 命中的节点 * @return ture 需要删除 false 不能被删除 */ private boolean isRemoveNode(SysDepartmentCascadeVO root, List hitIds) { List children = root.getChildren(); // 叶子节点 if(CollectionUtil.isEmpty(children)){ return !hitIds.contains(Integer.valueOf(root.getValue())); } // 子节点 if(hitIds.contains(Integer.valueOf(root.getValue()))){ return false; } boolean bool = true; for (SysDepartmentCascadeVO child : children) { if(!isRemoveNode(child,hitIds)){ bool = false; break; } } return bool; } }