精华内容
下载资源
问答
  • 这种递归最好用于5以下的分类。也可以做成无限级的,但是这样对服务器不是很友好。由于小编的数据表的分类有一千多条信息,就不提供数据表的信息了,小编就跟大家说一下数据表结构,认住个数据就行了,其他都不...

    小编没写过无限级的分类,刚好有个小项目是需要写无限级的。

    这种递归最好用于5级以下的分类。也可以做成无限级的,但是这样对服务器不是很友好。

    由于小编的数据表的分类有一千多条信息,就不提供数据表的信息了,小编就跟大家说一下数据表结构,认住三个数据就行了,其他都不重要

    数据表结构: id(分类id)、name(分类名称)、parentld(父分类id,顶级分类是0)

    Category(实体类)

    @Data

    @Table(name = "数据表名称")

    public class Category {

    @Id

    @KeySql(useGeneratedKeys=true)

    private Long id; //分类id

    private String name; //分类名称

    private Long parentId; //父分类id,顶级分类是0

    private Boolean isParent;

    private Integer sort;

    private Date createTime;

    private Date updateTime;

    private List treeList =new ArrayList<>();

    }

    CategoryMapper(dao层)

    public interface CategoryMapper extends BaseMapper {

    //由于是用mybatis-plus的语法,所以不需要写查询语句

    }

    CategoryService(Service层)

    .selectAll()是mybatis-plus的语法,如果需要您是用ssm的可以在dao层写MySQL(获取表的所有数据)

    @Service

    public class CategoryService {

    @Autowired

    private CategoryMapper categoryMapper;

    /**

    * 获取所有分类

    * @return

    */

    public List queryCatList(){

    // 用boot获取分类的数据 selectAll在springboot中是获取数据表里的所有数据

    List data = categoryMapper.selectAll();

    //定义新的list

    List categoriesList = new ArrayList<>();

    //先找到所有的一级分类

    for(Category category : data){

    // 一级菜单的parentId是0

    if(category.getParentId() == 0){

    categoriesList.add(category);

    }

    }

    // 为一级菜单设置子菜单,getChild是递归调用的

    for(Category category : categoriesList){

    category.setTreeList(getChilde(category.getId(), data));

    }

    return categoriesList;

    }

    /**

    * 递归查找子菜单

    *

    * @param id 当前菜单id

    * @param rootList 要查找的列表

    * @return

    */

    private List getChilde(Long id, List rootList){

    //子菜单

    List childList = new ArrayList<>();

    for(Category category : rootList){

    // 遍历所有节点,将父菜单id与传过来的id比较

    if(category.getParentId().equals(id)){

    childList.add(category);

    }

    }

    // 把子菜单的子菜单再循环一遍

    for(Category category : childList){

    category.setTreeList(getChilde(category.getId(), rootList));

    }

    // 递归退出条件

    if (childList.size() == 0){

    return null;

    }

    return childList;

    }

    }

    CategoryController(web层)

    @RestController

    @RequestMapping("category")

    @CrossOrigin //简单跨域问题

    public class CategoryController {

    @Autowired

    private CategoryService categoryService;

    /**

    * 查询所有数据

    */

    @GetMapping("findList")

    public List queryCatList(){

    List list = categoryService.queryCatList();

    return list;

    }

    }

    效果图

    5bbbedb093d0c643ebe453cfa85b6605.png

    希望这篇文章对您有帮助!

    展开全文
  • @Override public List<CompanyTreeEntity> treeList() { List<CompanyTreeEntity> list = this.baseMapper.selectList(null); List<CompanyTreeEntity> collect = list.stream().filter(item ...
    @Override
    public List<CompanyTreeEntity> treeList() {
    
        List<CompanyTreeEntity> list = this.baseMapper.selectList(null);
        List<CompanyTreeEntity> collect = list.stream().filter(item -> item.getParentId() == 0)
                .map(item -> {
                    item.setChildren(getChrlidens(item, list));
                    return item;
                }).collect(Collectors.toList());
        return collect;
    }
    
    private List<CompanyTreeEntity> getChrlidens(CompanyTreeEntity root, List<CompanyTreeEntity> allList) {
        List<CompanyTreeEntity> categoryTree = allList.stream().filter(item -> item.getParentId().equals(root.getId()))
                .map(item -> {
                    item.setChildren(getChrlidens(item, allList));
                    return item;
                }).collect(Collectors.toList());
        return categoryTree;
    }
    

    在这里插入图片描述

    展开全文
  • 问题描述 解决方案 ... `category_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '分类级别(1-一级分类 2-二级分类 3-三级分类)', `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父分类i.

    问题描述

     

    解决方案

    数据库SQL

    CREATE TABLE `goods_category` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类id',
      `category_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '分类级别(1-一级分类 2-二级分类 3-三级分类)',
      `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父分类id',
      `category_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',
      `category_rank` int(11) NOT NULL DEFAULT '0' COMMENT '排序值(字段越大越靠前)',
      `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)',
      `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `create_user` int(11) NOT NULL DEFAULT '0' COMMENT '创建者id',
      `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      `update_user` int(11) DEFAULT '0' COMMENT '修改者id',
      PRIMARY KEY (`id`) USING BTREE
    ) 

    Service

    /**
     * <p>
     *  服务实现类
     * </p>
     *
     * @author ShenTuZhiGang
     * @since 2020-11-08
     */
    @Service
    public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategory> implements IGoodsCategoryService {
        @Autowired
        private GoodsCategoryMapper goodsCategoryMapper;
        @Override
        public List<GoodsCategory> listWithTree() {
            //1、查出所有分类
            List<GoodsCategory> entities = goodsCategoryMapper.selectList(null);
    
            //2、组装成父子的树形结构
            //2.1找到所有的一级分类
            List<GoodsCategory> level1Menus = entities.stream()
                    .filter((goodsCategory) -> goodsCategory.getParentId() == 0)
                    .peek((menu)-> menu.setChildren(getChildren(menu,entities)))
                    .sorted((menu1,menu2)->(menu1.getCategoryRank()==null?0:menu1.getCategoryRank()) - (menu2.getCategoryRank()==null?0:menu2.getCategoryRank()))
                    .collect(Collectors.toList());
    
            return level1Menus;
        }
        //递归查找所有菜单的子菜单
        private List<GoodsCategory> getChildren(GoodsCategory root,List<GoodsCategory> all){
            List<GoodsCategory> child = all.stream()
                    .filter(GoodsCategory -> GoodsCategory.getParentId().equals( root.getId()))
                    //找到子菜单
                    .peek(GoodsCategory -> GoodsCategory.setChildren(getChildren(GoodsCategory, all)))
                    //菜单的排序
                    .sorted((menu1,menu2)->(menu1.getCategoryRank())==null?0:menu1.getCategoryRank() - (menu2.getCategoryRank()==null?0:menu2.getCategoryRank()))
                    .collect(Collectors.toList());
            return child.isEmpty()?null:child;
        }
    
    }
    

     

    参考文章

    三级目录查询代码

    电商项目——如何查出所有三级分类,并以树形结构组装起来?

    三级分-类查询-递归树形结构数据获取

    Java 8 Stream peek 与 map的区别

    mybatis查询返回一个三级目录

    Java的Stream.collect()是否可以返回null?

    展开全文
  • 详细记录java流式编程,运用streamAPI filter,map...三级分类就有 P系列 mate系列 nova系列 iphone系列 等等 @Override public List<CategoryEntity> listWithTree() { //1.查出所有分类 List<CategoryEnt

    详细记录java流式编程,运用streamAPI filter,map,collect方法
    结合实战举例记录这些运用

    业务逻辑为 多级分类 比如 一级分类为 手机 二级分类 就有华为手机 苹果手机
    三级分类就有 P系列 mate系列 nova系列 iphone系列 等等

        @Override
        public List<CategoryEntity> listWithTree() {
            //1.查出所有分类
            List<CategoryEntity> entities = baseMapper.selectList(null);
    
            //2.组装成父子树形结构
                //2.1 找到所有一级分类 最顶部的父分类
            List<CategoryEntity> level1Menus = entities.stream().filter((categoryEntity) -> {
                return categoryEntity.getParentCid() == 0;//filter中的箭头函数来筛选,在我数据库中ParentCid == 0 的是一级分类
            }).map((menu)->{
                menu.setChildren(getChildren(menu,entities)); //map中对每一个实体对象来做映射,找到他们的子分类,见下方自定义方法
                return menu;
            }).sorted((menu1,menu2)->{
                return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());//解决空指针异常
            }).collect(Collectors.toList());//将结果转化为list类型
            return level1Menus;
        }
    
    
    
    
    
    
    
    
    //递归查找所有菜单的子菜单
        private  List<CategoryEntity> getChildren(CategoryEntity root,List<CategoryEntity> all){
            List<CategoryEntity> children = all.stream().filter((entity) -> {
                return entity.getParentCid() == root.getCatId();
            }).sorted((menu1, menu2) -> {
                return (menu1.getSort()==null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());//解决空指针异常
            }).map((entity) -> {
                //继续递归找子菜单
                entity.setChildren(getChildren(entity, all)); //继续调用本方法,递归往下找
                return entity;
            }).collect(Collectors.toList());
    
            return children;
        }
    
    展开全文
  • 在我们开发过程中经常看到有菜单的出现,一般菜单也是有分类的。一般来说一菜单下有N个二菜单,在我们做管理系统的时候菜单是必不可免的。那我们应该怎么去设计数据库表结构呢? 有些同学会说用张表"父级...
  • 1.0 查询,递归数据查询 构造树形结构 Spring中@RestController的作用等同于@Controller + @ResponseBody。要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法...
  • 首先我们看下这个功能实现的...第二:根据数据格式分析各级的区别:顶级与二级的区别,二级与三级的区别(这些区别就是在写代码时候的条件约束)第三:子列表包含子列表,这里使用递归调用。即将根据本身的id作为父类...
  • Hibernate注解实现单表递归树形结构

    千次阅读 2017-06-18 11:19:53
    在系统中,经常会用到无限级递归的树形结构,比如菜单、组织机构管理、多级分类等等,一般是在同一个表中定义父子关系实现这种树形结构,本文主要讲述如何运用hibernate全注解的方式实现这个功能。 [二]、环境 ...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    3.3 数据类型分类 48 3.4 基本数据类型 48 3.4.1 整型 49 3.4.2 字符型 49 3.4.3 浮点型 51 3.4.4 布尔型 52 3.5 基本类型的类型转换 53 3.5.1 自动类型转换 53 3.5.2 强制类型转化 54 3.5.3 表达式类型的...
  • JAVA基础课程讲义

    2017-08-30 23:39:14
    JAVA面向对象程序开发 52 编程语言发展史 52 类和对象是如何产生发展的?如何进化的? 52 面向对象思想初步(OOP初步Object Oriented Programming) 53 面向对象编程的语言的大特征简介 56 对象和类的概念 56 ...
  • Java语言基础下载

    热门讨论 2010-09-07 21:56:38
    数据库三级模式结构 279 数据库三个范式 280 范式总结 282 创建数据库 283 创建表 287 内容总结 290 独立实践 291 第十七章: 数据库(二) 292 学习目标: 292 查询(从基本到高级) 293 模糊查询 293 排序 295 集合...
  • java 面试题 总结

    2009-09-16 08:45:34
    HashMap是Hashtable的轻量实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
  • 第5章 不可不知的数据分类法 —— 数据类型 5.1 数据类型的意义 5.2 整数类型 5.2.1 byte类型 5.2.2 short类型 5.2.3 int类型 5.2.4 long类型 5.3 浮点类型 5.3.1 float类型 5.3.2 double类型 ...
  • JAVA程序设计教程

    热门讨论 2013-09-07 21:15:19
    2.2.1 单词分类 .......................................................................................................15 2.2.2 保留字..................................................................
  • HashMap是Hashtable的轻量实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...
  • 25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
  • Hibernate 树状映射

    千次阅读 2016-11-25 15:13:50
    在系统中,经常会用到无限级递归的树形结构,比如菜单、组织机构管理、多级分类等等,一般是在同一个表中定义父子关系实现这种树形结构,本文主要讲述如何运用hibernate全注解的方式实现这个功能。 [二]、环境 ...
  • 三级分类菜单,单独查询每级菜单分类都能查到,现在就是第三级分类的菜单有部分的分类查询不出来(navicat能查出来,java出不出来)。 这是单独查询的第三级分类,下面的红...
  • 设计模式分类:创建型、结构型、行为型 常用设计模式基本原理 经典设计模式总共有23种(现在远不止23种了,还有一些变种),全部掌握难度太大了,我们只需要掌握一些常用的就好了,必须要掌握的我用小红旗已经...
  • 软件设计师重点考点

    2013-12-08 22:26:39
    1.4 递归法 218 1.5 贪婪法 224 1.6 分治法 227 1.7 动态规划法 229 1.8 回溯法 234 1.9 分支定界法: 235 2.几个重要的算法程序 235 2.1 堆排序 235 2.2 归并排序 237 专题十一: 系统工程知识 239 1.系统与系统...
  • 第19章 实例分析:轻量Java 167 19.1 引言 167 19.2 概要 168 19.3 规范化和结构化的类型系统 170 19.4 定义 172 19.5 性质 176 19.6 编码及初始对象 177 19.7 注释 178 第四部分 递归类型 179 第20章 ...
  • 做了 3 年企业 SaaS,我收获的 10 点心得(Ping++ CEO 金亦冶) 在 Google 工作 10 年,到底能学到啥? 在此,附上一句格言,望共勉:好学若饥,谦卑若愚。 ↑↑↑ 返回顶部(RETURN THE TOP) ↑↑↑
  • 都说好记性不如烂笔头,定期的学习和整理必然对学习巩固有所帮助,这里通过索引的方式对全栈开发技术做一个系统分类,方便随时巩固和学习,当然还有面试。在学习这条路上难免会有很多盲点和学不完的知识。有道无术,...
  • 技术点 ADO.Net技术应用、SQLServer、MD5安全算法、基于NPOI的Excel文件处理、树状结构数据处理、递归、CodeSmith、代码生成器、层架构。 项目说明 这是一个用WinForm技术实现的系统,传智播客在开课的半个月就...
  • 技术点 ADO.Net技术应用、SQLServer、MD5安全算法、基于NPOI的Excel文件处理、树状结构数据处理、递归、CodeSmith、代码生成器、层架构。 项目说明 这是一个用WinForm技术实现的系统,传智播客在开课的半个月就...
  • 全书分为两个部分:第1部分占据了大约分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和...
  • 精通正则表达式~~~

    2009-05-07 12:36:48
    精通正则表达式第版 搜集于网络 前言..........I 第1章:正则表达式入门.... 1 解决实际问题... 2 作为编程语言的正则表达式... 4 以文件名做类比... 4 以语言做类比... 5 正则表达式的知识框架... 6 对于...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

java递归三级分类

java 订阅