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 的时间,这对于一个查询来说无疑是很慢的。因此后面更换了一种思路,通过一次性查询出所有的节点,最后在进行拼装。