代码

@Override
public ServerResponse getSelfAndChildrenCategory(Integer categoryId) {
    if (categoryId != null) return ServerResponse.error(ResponseCode.ILLEGAL_ARGUMENT.getCode(), "参数错误");
    Set<Category> categorySet = Sets.newHashSet(); // 初始化Set
    findChildCategory(categorySet, categoryId); // 递归
    List<Integer> categoryIdList = Lists.newArrayList(); // 初始化List
    for (Category categoryItem : categorySet) {
        categoryIdList.add(categoryItem.getId());
    }
    return ServerResponse.success(categoryIdList);
}

//递归算法,算出子节点
private Set<Category> findChildCategory(Set<Category> categorySet, Integer categoryId) {
    Category category = categoryMapper.selectByPrimaryKey(categoryId);
    // 将自己添加进去
    if (category != null) categorySet.add(category);
    //查找子节点,递归算法一定要有一个退出的条件
    List<Category> categoryList = categoryMapper.getChildrenCategory(categoryId);
    for (Category categoryItem : categoryList) {
        findChildCategory(categorySet, categoryItem.getId());
    }
    return categorySet;
}
/** 重写id的equals和hashCode方法,保证Set集合取出的值是不重复的 */
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Category category = (Category) o;

    return id.equals(category.id);
}

@Override
public int hashCode() {
    return id.hashCode();
}

参考文章

使用Set集合时:重写equals的同时为什么必须重写hashcode

【mmall】递归查询子节点并排重的更多相关文章

  1. oracle递归查询子节点

    通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...

  2. MySQL递归查询父节点或递归查询子节点-陈远波

    根据id查询父节点,具体需要修改的地方笔者已在注释中给大家作了注解 DELIMITER $$ USE `yjlc_platform`$$ -- getCompanyParent 为函数名 DROP F ...

  3. mysql自定义function 写递归查询子节点

    #存储文本信息表 CREATE TABLE WordInfoEntity( word_id ) PRIMARY KEY NOT NULL, # 主键ID UUID word_greda :正文文本 , ...

  4. 包含mysql 递归查询父节点 和子节点

    包含mysql 递归查询父节点 和子节点 mysql递归查询,查父集合,查子集合 查子集合 --drop FUNCTION `getChildList` CREATE FUNCTION `getChi ...

  5. MySQL递归查询树状表的子节点、父节点具体实现

    mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算 ...

  6. MySQL递归查询树状表的子节点、父节点

    表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有parentid字段; 如下mysql查询函数即可实现根据一个节点查询所有的子节点,根据一个子节点查询所有的父节点.对于数据 ...

  7. (转)jQuery EasyUI Tree - TreeGrid动态加载子节点

    有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载顶层节点. 然后点击节点的展开图标来加载它的子节点. 本教程展示 ...

  8. Easyui _treegrid 动态加载子节点

    <table id="dg" class="easyui-treegrid" title="数据字典列表" data-options= ...

  9. jquery easyui tree动态加载子节点

    1.前端tree绑定时,使用onBeforeExpand事件:当节点展开时触发加载子节点,自动会向服务端发送请求:url为绑定url,参数为当前节点id this.tree = { method: ' ...

随机推荐

  1. canvas的api小结

    HTML <canvas id="canvas"></canvas> Javascript var canvas=document.getElementBy ...

  2. java的集合

    Collection: 1.list ArrayList.Vector.LinkedList ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. Vector是 ...

  3. POJ 2823 Sliding Window (单调队列)

    单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...

  4. 数据库事务的隔离以及spring的事务传播机制

    数据库的事务隔离: MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”RR(REPEATABLE READ). oracle默认的是提交读.RC 未提交读(READ UNCOMMITTE ...

  5. linux之/proc

    /proc是Linux或UNIX中的一种伪文件系统机制,提供了访问内核运行结构.改变内核设置的实时数据. 与ext4.NFS.FAT32等文件系统不同,/proc中的数据存放在内存而不是硬盘上. 在/ ...

  6. 黑苹果是否会成为mac电脑的竞争对手?

    最近黑科技技术大佬们都在传扬windows系统上安装mac系统,不用买mac电脑也可以使用mac一样的操作环境.什么是黑苹果?一起来看看如何在windows系统上安装mac系统. 更多专题,可关注小编 ...

  7. sql server开发工具

    查询分析器的使用 SQL语言包含四个部分: 1.数据定义语言(DDL) : 例如 create, drop, alter等语句 2.数据操作语言(DML) : 例如 insert,delete, up ...

  8. Spring_AOP 实现原理与 CGLIB 应用

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html AOP(Aspect Orient Progr ...

  9. saltstack grains

    saltstack的grains类似于ansible的setup模块,主要作用为手机客户端的主机基本信息(cpu,内核,os,virtual等),定义在客户端 [root@k8s_master ~]# ...

  10. bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...