java 对部门组织筛选过后向上查找组成树形(多层嵌套)

需求描述

目前大部分文章都是以全部组织一起展示,我需要对部门部分组织进行树形的结构的实现返回给前端,即找到目标部门,实现目标部门及其所有父部门组成树形返回,子部门不返回
直接上代码

实体类

import java.util.ArrayList;
import java.util.List;
public class Menu {
    //id
    private String id;
    //菜单名
    private String name;
    //父节点id
    private String pid;
    //子节点信息
    private List<Menu> children = new ArrayList<>();
    //无参构造
    public Menu() {}
    //带参构造
    public Menu(String id, String name, String pid) {
        this.id = id;
        this.name = name;
        this.pid= pid;
    }
    public void setId(String id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setPid(String pid) {
        this.pid = pid;
    }
    public void setChildren(List<Menu> children) {
        this.children = children;
    }
    public String getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public String getPid() {
        return pid;
    }
    public List<Menu> getChildren() {
        return children;
    }
}

实现方法

private List<Menu> getTree(List<Menu> menusNeed, List<Menu> menus) {
        for (int i = 0; i < menusNeed.size(); i++) {
            // 当前节点
            Menu menu1 = menusNeed.get(i);
            // 当前节点父节点(每个节点只有一个父节点)
            List<Menu> list = menus.stream().filter(menu ->
                    Objects.equals(menu1.getPid(), menu.getId())
            ).collect(Collectors.toList());
            // 有父节点的情况
            if (list.size() > 0) {
                // 判断当前节点的父节点是否已经存在need列表中
                boolean b = menusNeed.stream().anyMatch(menu ->
                        Objects.equals(list.get(0).getId(), menu.getId()));
                if (!b){
                    // 不存在则将其加入need列表
                    menusNeed.addAll(list);
                    // 将当前节点加入其父节点的孩子中组成树
                    Menu last = menusNeed.get(menusNeed.size() - 1);
                    last.getChildren().add(menu1);
                }else {
                    // 存在则找出need中的已存在的父节点,将当前节点设置给它
                    // 注:
                    for (Menu menu : menusNeed) {
                        if (Objects.equals(menu.getId(), list.get(0).getId())){
                            menu.getChildren().add(menu1);
                            break;
                        }
                    }
                }
            }
        }
        // 筛选出根节点即可
        List<Menu> list = menus.stream().filter(menu ->
                Objects.equals(menu.getPid(), "0")
        ).collect(Collectors.toList());
        return list;
    }

main方法检测

public static void main(String[] args) {
        // 所有节点
        List<Menu> menus = new ArrayList<>();
        menus.add(new Menu("1", "根节点", "0"));
        menus.add(new Menu("2", "子节点1", "1"));
        menus.add(new Menu("3", "子子节点1.1", "2"));
        menus.add(new Menu("6", "子子子节点1.1.1", "3"));
        menus.add(new Menu("4", "子节点2", "1"));
        menus.add(new Menu("5", "子子节点2.1", "4"));

        menus.add(new Menu("7", "根节点q", "0"));
        menus.add(new Menu("8", "子节点q1", "7"));
        menus.add(new Menu("9", "子子节点q1.1", "8"));
        menus.add(new Menu("12", "子子子节点q1.1.1", "9"));
        menus.add(new Menu("10", "子节点q2", "7"));
        menus.add(new Menu("11", "子子节点q2.1", "10"));

        // 需要的目标节点
        List<Menu> menusNeed = new ArrayList<>();
        menusNeed.add(new Menu("3", "子子节点1.1", "2"));
        menusNeed.add(new Menu("6", "子子子节点1.1.1", "3"));
        menusNeed.add(new Menu("5", "子子节点2.1", "4"));
        menusNeed.add(new Menu("11", "子子节点q2.1", "10"));

        List<Menu> tree = getTree(menusNeed, menus);
        System.out.println();
    }

在这里插入图片描述
在这里插入图片描述
由于遍历了need集合中每一个menu,后续的话如果想在部门中添加用户信息可按需添加

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
/** * 根据等级查询类目 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LQAQWQi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值