添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
 public Result getBmsMenuList(UserSessionVO userSessionInfo) {
        // 查询顶级节点菜单
        List<BmsMenuVO> bmsMenuVOList = bmsMenuDao.selectBmsMenuList(new BmsMenuQueryConditionVO());
        for (BmsMenuVO bmsMenuVO : bmsMenuVOList) {
            getBmsMenuListByRecursion(bmsMenuVO);
        return Result.createWithModels(null, bmsMenuVOList);
 private void getBmsMenuListByRecursion(BmsMenuVO bmsMenuVO) {
        List<BmsMenuVO> bmsMenuVOS = bmsMenuDao.selectBmsMenuList(new BmsMenuQueryConditionVO().setParentId(bmsMenuVO.getId()));
        if (CollectionUtils.isEmpty(bmsMenuVOS)) {
            return;
        bmsMenuVO.setChildBmsMenuList(bmsMenuVOS);
        for (BmsMenuVO menuVO : bmsMenuVOS) {
            getBmsMenuListByRecursion(menuVO);

2.双层for

// 查询主节点
List<BmsMenuVO> bmsMenuVOList = bmsRoleMenuDao.getAllRoleMenuList(condition);
// 拼装结果
 List<BmsMenuVO> bmsMenuTree = new ArrayList<>();
 for (BmsMenuVO bmsMenuVO : bmsMenuVOList) {
      // 根节点的父Id为null
      if (bmsMenuVO.getParentId() == null) {
                bmsMenuTree.add(bmsMenuVO);
      for (BmsMenuVO menuVO : bmsMenuVOList) {
           if (menuVO.getParentId() != null && menuVO.getParentId().equals(bmsMenuVO.getId())) {
               if (CollectionUtils.isEmpty(bmsMenuVO.getChildBmsMenuList())) {
                        bmsMenuVO.setChildBmsMenuList(new ArrayList<>());
                bmsMenuVO.getChildBmsMenuList().add(menuVO);
  // 返回结果
 return Result.createWithModels(null, bmsMenuTree);

3.map遍历

 // 查询所有节点
 List<BmsMenuVO> bmsMenuVOList = bmsRoleMenuDao.getAllRoleMenuList(condition);
 // 拼装结果     
 List<BmsMenuVO> bmsMenuTree = new ArrayList<>();
 // 用来存储节点的子元素map
 Map<Long, BmsMenuVO> childBmsMenuMap = new LinkedHashMap<>();
        for (BmsMenuVO menuVO : bmsMenuVOList) {
            childBmsMenuMap.put(menuVO.getId(), menuVO);
        for (Long bmsMenuId : childBmsMenuMap.keySet()) {
            BmsMenuVO menuVO = childBmsMenuMap.get(bmsMenuId);
            Long parentId = menuVO.getParentId();
            if (parentId == null) {
                bmsMenuTree.add(menuVO);
            } else {
                BmsMenuVO parentMenuVO = childBmsMenuMap.get(parentId);
                if (parentMenuVO.getChildBmsMenuList() == null) {
                    parentMenuVO.setChildBmsMenuList(new ArrayList<>());
                parentMenuVO.getChildBmsMenuList().add(menuVO);

总结上述代码,复杂度从上到下依次降低,最后用map只要两次循环,所以以后树结构可以不用递归

原文链接:https://blog.csdn.net/AllenJoe666/article/details/107233475/ 第一思路是递归方式,获取当前部门的所有子部门,接着再去递归子部门。但其实使用for循环也可以做到。 private List<DeptNode> generateTree(List<Dept> list) { List<DeptNode> nodes = new ArrayList<>(20); for (Dept dept : list) { 记录一道算法题:如下 根据字符序列0123456789abcdefghijklmnopqrstuvwxyz,按照序列顺序穷举生成一个N位小写字母和数字组合(N>1),每生成一个组合,不能全是字母或者全是数字。(例如用Java实现或者其它) 全身数字的情况,或者全是字母,则不行: 1111,222,01,aaaa,abcd,eb 数字和字母混合则可以: a00,00a,aa1,ce2f 调用第一次 调用第二次,输出: 调用第三次,输出: 当时考虑的.. 前言:作为前端,经常遇见要处理树形结构的数据(比如菜单、树形结构的人员组织),之前常规的操作就是使用递归遍历,但最近发现递归容易出现栈溢出,所以开始思考有没有其他方式来实现遍历,既能提高性能又能避免栈溢出。 1、首先写个方法生成一个简单的树结构 function createTree(deep){ var children={}; var tree={id:0,children}; for(var i=1;i<=deep;i++){ children.id=i; children. 最近项目中遇到了层级树形结构,数据库存放着的是节点id,以及节点的父节点,刚开始是通过递归节点id作为下一层父节点id的形式,用很多条sql来进行查询直接得出的,,但是由于随着层数以及数据的增加,而且同一层级之间涉及到菜单优先级排序的问题,递归的sql及时是组装一起进行批量查询也需要将近 2s 的时间,这对于一个查询来说无疑是很慢的。因此后面更换了一种思路,通过一次性查询出所有的节点,最后在进行拼装。