父子树状结构图

遍历获取父子树状结构的MAP集合。
用Map集合通用性比较高。

private List<Map<String, Object>> treeMenuList(List<Map<String, Object>> childMenu, List<Map<String, Object>> allMenu, String pid) {
        for (Map<String, Object> map : allMenu) {
            String supdepid = map.get("parentId") == null ? null : map.get("parentId").toString();
            String departmentId = map.get("id") == null ? null : map.get("id").toString();
            if (pid.equals(supdepid)) {
                List<Map<String, Object>> childrenList = treeMenuList(new ArrayList<>(), allMenu, departmentId);
                map.put("childrenDepartment", childrenList);
                childMenu.add(map);
            }
        }
        return childMenu;
    }

当父子树状图需要对一个对象集合来操作的时候

 /**
     * 根据工号,和系统的id(mark) 来获取菜单的框架,分级那种。
     * @param menuQueryBo
     * @return
     */
    /**
     * 利用递归循环查询
     * 每一层查询其员工封装到一个对象map集合中
     * 员工是根据部门的id来查询的,一对多
     * 和查询部门封装到一个对象map集合中
     * 当根据父id查询不到部门的时候循环结束。
     */
    //全局变量
    private List<MenuVO> allDepartment = new ArrayList<>();  //全局变量

    @Override
    public Response<List<MenuVO>> getMenuByworkCodeAndSystemIdForFrame(MenuQueryBo menuQueryBo) {


        //先获取所有的数据  该数据取 没有做父子类的数据,
        List<MenuBO> data = this.getMenuByworkCodeAndSystemId(menuQueryBo).getData();

        if (data == null || data.size() == 0) {
            Response response = new Response();
            response.setCode(0);
            response.setMessage("没有关联的菜单");
            return response;
        }
        /**
         * 找到符合条件的角色的所有父类直到parentId为0;
         */
        List<MenuVO> datumList = new ArrayList<>();
        //把获取的值给全值集合
        for (MenuBO datum : data) {

            //getMenuVOParent(datum);
            allDepartment.add(MenuBOTransformVO.boToVO(datum));
        }
        List<MenuVO> menuVOList = new ArrayList<>();
       /* for (MenuVO datum : allDepartment) {
            //得到所有符合条件的menuVO集合
            // allDepartment.add(MenuBOTransformVO.boToVO(datum));
            if (datum.getParentId() == 0) {
                menuVOList.add(datum);
            }
        }*/
        for (int i = 0; i < allDepartment.size(); i++) {
            if (allDepartment.get(i).getParentId() == 0) {
                menuVOList.add(allDepartment.get(i));
            }

        }

        if (!menuVOList.isEmpty()) {

            List<MenuVO> list = new ArrayList<>();
            if (menuVOList != null) {
                for (int i = 0; i < menuVOList.size(); i++) {
                    list.add(recursiveTree(menuVOList.get(i).getId())); //获取一级节点的对象id
                }
            }
            allDepartment.clear();
            return Response.success(list);
        } else {
            //此时父id不是0;
            for (MenuVO menuVO : allDepartment) {
                List<MenuVO> menuVOList1 = new ArrayList<>();
                for (MenuVO menuVO1 : allDepartment) {
                    if (menuVO.getParentId() == menuVO1.getId()) {
                        menuVOList1.add(menuVO);

                    }
                }
                if (menuVOList1.isEmpty()) {
                    menuVOList.add(menuVO);
                }
            }
            List<MenuVO> list = new ArrayList<>();
            if (menuVOList != null) {
                for (int i = 0; i < menuVOList.size(); i++) {
                    list.add(recursiveTree(menuVOList.get(i).getId())); //获取一级节点的对象id
                }
            }
            allDepartment.clear();
            return Response.success(list);

        }

    }


    /**
     * 递归算法解析成树形结构
     *
     * @param cid
     */
    public MenuVO recursiveTree(Integer cid) {
        MenuVO node = new MenuVO();
        for (MenuVO menuVO : allDepartment) {
            if (menuVO.getId() == cid) {
                BeanUtils.copyProperties(menuVO, node);
            }
        }
        List<MenuVO> childTreeNodes = getChildTreeById(cid);

        for (MenuVO child : childTreeNodes) {
            MenuVO n = recursiveTree(child.getId());
            node.getChildren().add(n);
        }
        return node;
    }

    /**
     * 根据CID查询节点对象
     */
    public HrmDepartmentVO HrmDepartmentPO(Integer cid) {
        Map map = getTreeMap();
        return (HrmDepartmentVO) map.get(cid);
    }

    /**
     * 一次性取所有数据,为了减少对数据库查询操作
     *
     * @return
     */
    public Map getTreeMap() {
        Map map = new HashMap<Integer, HrmDepartmentPO>();
        if (null != allDepartment) {
            for (MenuVO d : allDepartment) {
                map.put(d.getId(), d);
            }
        }
        return map;
    }

    /**
     * 根据父节点CID获取所有了节点
     */
    public List<MenuVO> getChildTreeById(Integer cid) {
        List<MenuVO> list = new ArrayList<>();
        if (null != allDepartment) {
            for (MenuVO d : allDepartment) {
                if (null != cid) {
                    if (cid.equals(d.getParentId())) {
                        list.add(d);
                    }
                }
            }
        }

        return list;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现树形结构图,需要先有一个树形结构的数据模型,然后通过查询数据库获取数据,最后通过递归生成树形结构。以下是一个简单的示例: 1. 数据模型 假设我们有一个表格叫做`category`,它有以下字段: - id:分类的唯一标识 - name:分类的名称 - parent_id:父分类的id(如果没有父分类,则为null) 我们可以用一个Java类来表示这个数据模型: ``` public class Category { private int id; private String name; private Integer parentId; // 注意这里用了Integer类型,因为parent_id可能为null // 省略getter和setter } ``` 2. 查询数据库 我们可以使用JDBC或ORM框架(如MyBatis、Hibernate等)来查询数据库,这里以MyBatis为例: ``` @Mapper public interface CategoryMapper { @Select("SELECT id, name, parent_id FROM category ORDER BY parent_id, id") List<Category> findAll(); } ``` 这里的`@Mapper`和`@Select`是MyBatis的注解,表示这是一个Mapper接口,以及查询所有的分类数据。 3. 生成树形结构 最后,我们可以使用递归来生成树形结构。首先,我们需要定义一个方法,它的输入是所有的分类数据,输出是一个根节点: ``` public CategoryNode buildTree(List<Category> categories) { Map<Integer, CategoryNode> nodes = new HashMap<>(); // 用Map来快速查找节点 // 遍历所有分类,创建节点 for (Category category : categories) { CategoryNode node = new CategoryNode(category.getId(), category.getName()); nodes.put(category.getId(), node); } // 遍历所有分类,连接父子节点 for (Category category : categories) { Integer parentId = category.getParentId(); if (parentId != null) { CategoryNode parent = nodes.get(parentId); CategoryNode child = nodes.get(category.getId()); parent.addChild(child); } } // 最后返回根节点 for (CategoryNode node : nodes.values()) { if (node.getParent() == null) { return node; } } return null; // 如果没有根节点,则返回null } ``` 这个方法的思路很简单:先遍历所有分类,创建对应的节点并存储到Map中;然后再遍历所有分类,连接父子节点;最后找到根节点并返回。这里的`CategoryNode`是一个自定义的类,它表示一个节点: ``` public class CategoryNode { private int id; private String name; private List<CategoryNode> children = new ArrayList<>(); private CategoryNode parent; public CategoryNode(int id, String name) { this.id = id; this.name = name; } public void addChild(CategoryNode child) { children.add(child); child.setParent(this); } // 省略getter和setter } ``` 这个类有四个属性:id、name、children、parent。其中,children表示它的子节点,parent表示它的父节点。addChild方法用于添加子节点时同时设置父子关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值