java递归设置层级菜单的实现
作者:是赵敢敢啊 发布时间:2023-03-05 14:14:57
标签:java,递归,层级菜单
思路:
先从集合中找出来顶级的菜单,然后遍历顶级菜单,找出每个顶级菜单的所有子菜单,然后判断当前需要排列的集合是否为空,如果不为空的话,就在遍历子菜单的下级菜单,直至没有需要排列的菜单。
使用迭代器,符合条件之后将数据删除们可以减少遍历的次数
package com.eleven;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* @author zhaojinhui
* @date 2021/6/4 15:11
* @apiNote
*/
public class ElevenTest {
public static void main(String[] args) {
TestChild one = new TestChild("1","1",null);
TestChild two = new TestChild("2","2","1");
TestChild sex = new TestChild("3","3","2");
List<TestChild> list = new ArrayList<>(3);
Collections.addAll(list,one,two,sex);
List<TestChild> tree = getTree(list);
System.out.println(tree);
}
public static List<TestChild> getTree(List<TestChild> testChildList){
List<TestChild> result = new ArrayList<>();
for (TestChild testChild : testChildList) {
if(StrUtil.isBlank(testChild.getParentId())){
result.add(testChild);
}
}
testChildList.removeAll(result);
for (TestChild testChild : result) {
setChildren(testChild,testChildList);
}
return result;
}
public static void setChildren(TestChild parent,List<TestChild> list){
List<TestChild> childList = new ArrayList<>();
for(Iterator<TestChild> iterator = list.iterator();iterator.hasNext();){
TestChild next = iterator.next();
if(parent.getCode().equals(next.getParentId())){
childList.add(next);
iterator.remove();
}
}
parent.setChildren(childList);
/**
判断子集集合是否为空比遍历整个集合是否为空要慢
if(CollUtil.isNotEmpty(childLlist)) {
for (TestChild testChild : childList) {
setChildren(testChild, list);
}
}
*/
if(CollUtil.isNotEmpty(list)) {
for (TestChild testChild : childList) {
setChildren(testChild, list);
}
}
}
}
@Data
@AllArgsConstructor
class TestChild{
private String name;
private String code;
private String parentId;
List<TestChild> children;
public TestChild(String name,String code,String parentId){
this.name = name;
this.code = code;
this.parentId = parentId;
}
}
来源:https://blog.csdn.net/qq_42059717/article/details/117927209


猜你喜欢
- [LeetCode] 205. Isomorphic Strings 同构字符串Given two strings s
- listview实现上拉加载以及下拉刷新的方式有很多。下面是我写的一种自定义的布局,复用性也比较的强。首先就是继承的listview的自定义
- 前言图片作为内存消耗大户,一直是开发人员尝试优化的重点对象。Bitmap的内存从3.0以前的位于native,到后来改成jvm,再到8.0又
- Spring Boot 自动装配最重要的注解@SpringBootApplication@Target(ElementType.TYPE)@
- 相信大家都有这样的一个需求,选择相应开始时间和结束时间,对数据进行筛选,下面就将使用TimePickerView实现这么一个功能。一、先导入
- 面试题一:判断下列程序运行结果package String_test;public class test_1 { public static
- 单个和批量定义别名typeAliases使用Mybatis的别名typeAliases可以在xml文件里非常方便的使用类,而不需要写出这个类
- Mybatis Log Plugin使用今天发现大部分猿友关于查看执行sql语句的方法,只知道将其输出到控制台。然而还有更简便的方法,就是使
- Spring boot + Spring data jpa + Thymeleaf批量插入 + POI读取 + 文件上传pom.xml:&l
- 1、添加依赖<dependency> <groupId>org.springframewo
- 汇总:1. 冒泡排序每轮循环确定最值;public void bubbleSort(int[] nums){ in
- Android 中RecycleView实现item的点击事件RecycleView现在已经越来越受到大家的重视,因为他既可以代替listV
- 本实例主要实现下面三个基本功能1、C#开发windows服务2、禁止QQ等程序运行3、为windows服务创建自动安装程序下面针对这三个基本
- 前言笔者上次用C#写.Net代码差不多还是10多年以前,由于当时Java已经颇具王者风范,Net几乎被打得溃不成军。因此当时笔者对于这个.N
- 1.属性驱动 前台表单中字段的name和后台action中的属性字段的名称必须保持一致;2.域驱动 前台表单中字段的name应该为:obje
- 定义:/** * @author Administrator * @project: TestOne * @package: PACKAGE
- 前言你好! 本文章主要介绍如何用Android Studio制作简易的门户界面,主要说明框架的各部分功能与实现过程,结尾处附有源码。界面分析
- 本文实例讲述了Android生成带圆角的Bitmap图片。分享给大家供大家参考。具体如下:有时候我们在开发Android应用时,会遇到圆角图
- 本文实例为大家分享了C#实现银行家算法的具体代码,供大家参考,具体内容如下1.死锁死锁,顾名思义,是一种锁住不可自行解开的死局。在操作系统中
- 本文实例讲述了java实现求两个字符串最长公共子串的方法。分享给大家供大家参考,具体如下:这个是华为OJ上的一道题目。首先,如果我们用jav