java实现递归算法的两种方式

简介: 所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。

方法一:

@Override

public List<CategoryEntity> listWithTree() {

   //1,查出所有分类

   List<CategoryEntity> entities = baseMapper.selectList(null);

   //2,组装成父子树形结构

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

   List<CategoryEntity> level1Menus = entities.stream().filter(categoryEntity ->

        categoryEntity.getParentCid() == 0

   ).map((menu)->{

       menu.setChildren(getChildrens(menu,entities));

       return menu;

   }).sorted((menu1,menu2)->{

       return (menu1.getSort() == null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());

   }).collect(Collectors.toList());

   return level1Menus;

}

//递归查找所有菜单的子菜单

private List<CategoryEntity> getChildrens(CategoryEntity root,List<CategoryEntity> all){

   List<CategoryEntity> chirdren = all.stream().filter(categoryEntity -> {

           return categoryEntity.getParentCid() == root.getCatId();

   }).map(categoryEntity -> {

       //找到子菜单

       categoryEntity.setChildren(getChildrens(categoryEntity,all));

       return categoryEntity;

   }).sorted((menu1,menu2)->{

       //菜单的排序

       return (menu1.getSort() == null?0:menu1.getSort()) - (menu2.getSort()==null?0:menu2.getSort());

   }).collect(Collectors.toList());

   return chirdren;

}



递归方式二:

   private List<Map<String, Object>> getMenu(List<MenuCopy1> menuCopy1s , Integer pid){

       List<Map<String, Object>> mapList = new ArrayList<>();

       for (int i = 0; i < menuCopy1s.size(); i++) {

           Map<String,Object> map = null;

           MenuCopy1 menuCopy1 = menuCopy1s.get(i);

           if (pid == menuCopy1.getPid()){

               map = new HashMap<>();

               map.put("id",menuCopy1.getId());

               map.put("text",menuCopy1.getText());

               map.put("url",menuCopy1.getUrl());

               map.put("nodes",getMenu(menuCopy1s,menuCopy1.getId()));

           }

           if (map!=null){

               List<Map<String, Object>> nodes = (List<Map<String, Object>>) map.get("nodes");

               if (nodes.size()<=0){

                   map.remove("nodes");

               }

               mapList.add(map);

           }

       }

       return mapList;

   }

目录
相关文章
|
1月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
30天前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
41 1
|
20天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
37 2
|
1月前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
148 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
28天前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
1月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
36 6
|
1月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
46 2
|
1月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
37 1
|
1月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
35 1
|
2月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
41 3