当前位置: 首页 > news >正文

递归函数的写法笔记

脑袋总是记不住,做个笔记记下方便用时查询。

 

情景一:Java电商项目中的商品品类管理。品类呈树形结构,现要求找到某一节点下的所有子节点。

// 递归算法,找到子节点
private Set<Category> findChildCategory(Set<Category> categorySet, Integer categoryId){
    // Mybatis的数据库查询方法
    Category category = categoryMapper.selectByPrimaryKey(categoryId);
    if (category != null){
        categorySet.add(category);
    }

    // 查找子节点,如果子节点为空就退出递归。递归算法一定要有一个退出的条件
    List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
    for (Category categoryItem : categoryList){
        findChildCategory(categorySet, categoryItem.getId());
    }

    return categorySet;
}

这里为了防止品类重复使用了Set集合。使用该集合要求实体类Category重写equals()和hashCode()方法。

 

情景二:WPF中UI呈树形结构,想要查找指定控件下的所有子控件。

public static List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
    DependencyObject child = null;
    List<T> childList = new List<T>();

    for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
    {
        child = VisualTreeHelper.GetChild(obj, i);

        if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
        {
            childList.Add((T)child);
        }

        childList.AddRange(GetChildObjects<T>(child, ""));
    }

    return childList;
}

 

观察函数的规律:

  • 返回值和传参是相同的集合列表。
  • 传参一个变量用来筛选符合条件的子节点。

 

获取文件下所有层级的文件

public static List<string> GetAllFiles(DirectoryInfo dir)
{
    FileInfo[] fileInfos = dir.GetFiles();
    foreach (FileInfo fi in fileInfos)
    {
        FileList.Add(fi.Name);
    }
    DirectoryInfo[] dirInfos = dir.GetDirectories();
    foreach (DirectoryInfo d in dirInfos)
    {
        GetAllFiles(d);
    }
    return FileList;
}

 

相关文章:

  • mysql手写sql 建库建表示例
  • Eonasdan bootstrap datetimepicker 使用记录
  • 新版本Jenkins安装时显示离线的问题
  • WEBGL学习【十四】利用HUD技术在网页上方显示三维物体
  • Hibernate映射——多对多关联映射(八)
  • kafka官方文档学习笔记1--基本概念了解
  • [TLSR8266] 1、搭建tlsr8266编译框架在win服务器中
  • net 自定义泛型那点事
  • Android Studio 解决 Error: /data/local/tmp/com.mazaiting.imgtomp4test安装失败问题
  • CSS选择器:伪类(图文详解)
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • 我的Java设计模式-中介者模式
  • debian配置node和nodejs环境
  • iOS开发CoreData的多表关联
  • [xsy2369]取名字
  • JavaScript-如何实现克隆(clone)函数
  • “大数据应用场景”之隔壁老王(连载四)
  • bootstrap创建登录注册页面
  • CSS 三角实现
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PHP CLI应用的调试原理
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • vue-router的history模式发布配置
  • webpack4 一点通
  • webpack入门学习手记(二)
  • win10下安装mysql5.7
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 什么软件可以剪辑音乐?
  • 使用common-codec进行md5加密
  • 数据科学 第 3 章 11 字符串处理
  • 提醒我喝水chrome插件开发指南
  • 突破自己的技术思维
  • 微信小程序填坑清单
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习笔记TF060:图像语音结合,看图说话
  • 用 Swift 编写面向协议的视图
  • 责任链模式的两种实现
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 湖北分布式智能数据采集方法有哪些?
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​什么是bug?bug的源头在哪里?
  • ​虚拟化系列介绍(十)
  • $$$$GB2312-80区位编码表$$$$
  • (C++17) std算法之执行策略 execution
  • (JS基础)String 类型
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (黑马C++)L06 重载与继承