Java【递归及过滤器】


文章目录

  • Java【递归及过滤器】
    • 一、递归
      • 1、概念&分类&注意事项
      • 2、练习:递归计算1-n的和
      • 3、练习:递归计算阶乘
      • 4、练习:递归打印多级目录
      • 5、综合案例:文件搜索
    • 二、过滤器接口
      • 1、`java.io.FileFilter`
      • 2、`java.io.FilenameFilter`

一、递归

1、概念&分类&注意事项

概念:方法自己调用自己

分类

直接递归 自己调用自己
间接递归 A调用B,B调用C,C调用A

注意事项

  • 递归必须有终止条件。否则会导致Exception in thread "main" java.lang.StackOverflowError栈溢出。
  • 次数不能太多。否则也会导致栈溢出。
  • 构造方法禁止递归。会发生编译报错:构造方法创建对象使用的,一直递归会导致内存中有无数多个对象。

递归的使用前提:方法的主体不变,每次调用方法的参数不同。

2、练习:递归计算1-n的和
/*练习:使用递归计算1-n之间的和*/
public class Demo02Recursion {public static void main(String[] args) {int s = sum(10);System.out.println("s=" + s);}/*定义一个方法,使用递归计算1-n之间的和使用递归必须明确:1、递归结束的条件读取到12、递归的目的获取下一个被加的数字*/private static int sum(int n) {// 结束条件if(n == 1) return 1;// 递归调用return n + sum(n-1);}
}
3、练习:递归计算阶乘
/*练习:使用递归计算阶乘*/
public class Demo03Recursion {public static void main(String[] args) {long jc = jc(10);System.out.println(jc(6));}/*定义递归计算阶乘的方法*/private static long jc(int n) {if(n ==1 ) return 1;return n*jc(n-1);}
}
4、练习:递归打印多级目录
/*练习:递归打印多级目录*/
public class Demo04Recursion {public static void main(String[] args) {File file = new File("/Users/yanzhuang/Desktop/a/C");printAllFile(file);}/*定义一个方法,递归打印所有目录*/public static void printAllFile(File dir){System.out.println(dir);// 打印初始目录File[] files = dir.listFiles();// 遍历目录中的所有File对象for (File file : files) {// 如果file是目录的话,递归调用if(file.isDirectory()) {printAllFile(file);} else {// 如果不是,直接打印System.out.println(file);}}}
}
5、综合案例:文件搜索

要求:搜索指定目录中的".java"文件

主要方法public File[] listFiles() : 返回一个抽象路径名数组,表示由此抽象路径名表示的目录中的文件。

/*综合案例:搜索指定目录中的 .java 文件分析:1、遍历多层级目录2、遍历目录时对子文件进行名称判断*/
public class Demo05Recursion {public static void main(String[] args) {File file = new File("/Users/yanzhuang/IdeaProjects/basic-code/day19-advanced/src/com/s0cket/day19");printAllFiles(file);}/*定义一个方法,对指定目录进行遍历*/public static void printAllFiles(File dir){// 获取dir中的所有File对象File[] files = dir.listFiles();// 遍历File对象数组for (File file : files) {// 判断file对象是否是文件夹if(file.isDirectory()) {// 是文件夹继续递归调用printAllFiles方法printAllFiles(file);} else {// 不是文件夹// 就是文件// 判断是否是.java结尾if(file.getName().toLowerCase().endsWith(".java")){// 如果是java文件,打印file.toStringSystem.out.println(file);}}}}
}

二、过滤器接口

File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器。

public File[] listFiles(FileFilter filter)
public File[] listFiles(FilenameFilter filter)
1、java.io.FileFilter

作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。参数:

File pathname–使用listFiles方法遍历目录,得到的每一个文件对象。

传统实现方式(实现类重写accept方法)

/*创建过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则*/
public class FileFilterImpl implements FileFilter {@Overridepublic boolean accept(File pathname) {/*过滤的规则:在accept方法中判断文件是否以".java"结尾是的话返回true,否就返回false*/// 如果pathname是一个文件夹,则返回true,继续遍历这个文件夹if(pathname.isDirectory()){return true;}// 不是文件夹就是文件,将是否是java文件的判断结果返回return pathname.getName().toLowerCase().endsWith(".java");}
}
// main方法
public class Demo01Filter {public static void main(String[] args) {File f = new File("/Users/yanzhuang/Desktop/A");getAllFiles(f);}public static void getAllFiles(File pathname){/*传递过滤器此时的过滤器可以自动过滤出目录和.java结尾的File对象放置在File数组中*/File[] files = pathname.listFiles(new FileFilterImpl());// 传递过滤器// 遍历File数组for (File file : files) {// 判断file对象是文件夹还是文件if(file.isDirectory()){// 如果File对象是目录的话,继续递归调用自身getAllFiles(file);}else {// 不是目录的话就是.java文件,打印输出System.out.println(file);}}}
}

使用匿名内部类简化

public class Demo02Filter {public static void main(String[] args) {File f = new File("/Users/yanzhuang/Desktop/A");getAllFiles(f);}public static void getAllFiles(File pathname){/*传递过滤器此时的过滤器可以自动过滤出目录和.java结尾的File对象放置在File数组中*/// 传递过滤器FileFilter,使用匿名内部类方式File[] files = pathname.listFiles(new FileFilter() {@Overridepublic boolean accept(File pathname) {// 过滤规则,pathname是文件夹或者是.java结尾的文件返回truereturn pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");}});// 遍历File数组for (File file : files) {// 判断file对象是文件夹还是文件if(file.isDirectory()){// 如果File对象是目录的话,继续递归调用自身getAllFiles(file);}else {// 不是目录的话就是.java文件,打印输出System.out.println(file);}}}
}

使用Lambda表达式进一步简化:(接口都只有一个抽象方法)

public class Demo03Filter {public static void main(String[] args) {File f = new File("/Users/yanzhuang/Desktop/A");getAllFiles(f);}public static void getAllFiles(File pathname){/*传递过滤器此时的过滤器可以自动过滤出目录和.java结尾的File对象放置在File数组中*/// 传递过滤器FileFilter,使用匿名内部类方式,Lambda表达式File[] files = pathname.listFiles(dir -> dir.isDirectory() || dir.getName().toLowerCase().endsWith(".java"));// 遍历File数组for (File file : files) {// 判断file对象是文件夹还是文件if(file.isDirectory()){// 如果File对象是目录的话,继续递归调用自身getAllFiles(file);}else {// 不是目录的话就是.java文件,打印输出System.out.println(file);}}}
}
2、java.io.FilenameFilter

作用: 用于过滤文件的方法
抽象方法:用来过滤文件的方法boolean accept(File dir, String name) 测试指定文件夹是否应该包含在某一文件列表中。参数:

File dir–构造方法中传递的被遍历的目录

String name–使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称

使用匿名内部类方式

public class Demo02Filter {public static void main(String[] args) {File f = new File("/Users/yanzhuang/Desktop/A");getAllFiles(f);}public static void getAllFiles(File pathname){/*传递过滤器此时的过滤器可以自动过滤出目录和.java结尾的File对象放置在File数组中*/// 传递过滤器FilenameFilter,使用匿名内部类方式File[] files = pathname.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");}});// 遍历File数组for (File file : files) {// 判断file对象是文件夹还是文件if(file.isDirectory()){// 如果File对象是目录的话,继续递归调用自身getAllFiles(file);}else {// 不是目录的话就是.java文件,打印输出System.out.println(file);}}}
}

FilenameFilter过滤器也可以使用Lambda表达式进行简化:

// 传递过滤器FilenameFilter,使用Lambda表达式简化
File[] files = pathname.listFiles((dir,name) ->
new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java"));

Java【递归及过滤器】相关推荐

  1. java filenamefilter_「创作开运礼」Java之FileNameFilter过滤器的使用

    各位小伙伴们大家好,在之前的文章中小编介绍了Java之FileFilter过滤器的使用与及原理的简单介绍,这次小编要介绍的是ileNameFilter过滤器的使用. 在使用FileFilter过滤器的 ...

  2. LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal-前序中序遍历构造二叉树-Python和Java递归解法

    题目地址:Construct Binary Tree from Preorder and Inorder Traversal - LeetCode Given preorder and inorder ...

  3. Java 递归解决 quot;仅仅能两数相乘的计算器计算x^yquot; 问题

    Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题 /*** 求一个数的乘方* 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知 ...

  4. Java web—Servlet过滤器(Filter)

    前言:         过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器:因此这篇blog来单独总结下关于过滤器的知识点. 一.首先来了解一下什么是过滤器: 下面这句话引 ...

  5. java 递归 堆栈_Java中的堆栈安全递归

    java 递归 堆栈 在本文中,摘自< Java中的函数编程 >一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险. Corecursion正在使用第一步的输出作为 ...

  6. java面包屑实现_在Java中实现过滤器和面包店锁

    java面包屑实现 为了了解锁的工作原理,实现自定义锁是一种好方法. 这篇文章将展示如何在Java上实现Filter和Bakery锁(自旋锁),并将它们的性能与Java的ReentrantLock进行 ...

  7. java 递归改非递归_使用Java ThreadLocals的意外递归保护

    java 递归改非递归 对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说,这是一个小技巧. 假定以下情况: 您想扩展一个展示分层数据模型的库(假设您要扩展Apache Jackrabbi ...

  8. java递归基础掉用_Java递归基础

    java递归基础掉用 对于那些不知道递归是什么的人(并且像个大笑者一样),请单击以下链接:Google搜索:递归,然后单击"您的意思是--"项. 希望您终于弄清楚了递归是指其自身的 ...

  9. 在Java中实现过滤器和面包店锁

    为了了解锁的工作方式,实现自定义锁是一个好方法. 这篇文章将展示如何在Java上实现Filter和Bakery锁(自旋锁),并将它们的性能与Java的ReentrantLock进行比较. 过滤器锁和面 ...

  10. java nodefilter类,Java Servlet Filter过滤器概述

    Java Servlet Filter过滤器概述 Filter是Servlet的过滤器,是Servlet 2.3规范中新增加的一个功能,主要用于完成一些通用的操作,如编码的过滤.判断用户的登录状态等. ...

最新文章

  1. php因屏幕分辨率显示不一样,分辨率dpi是什么意思
  2. eclipse android logcat 只显示自己应用程序信息的设置方法
  3. 递归函数python有什么特点_Python中的递归
  4. python: 基本的日期与时间转换
  5. 复杂背景下计算机视觉模型害虫识别的比较研究(像素语义分割网络SegNet)
  6. oracle同时删除一行数据,oracle 多表删除 同时删除多表中关联数据
  7. Everything必知必会搜索教程
  8. 先电OpenStack创建云主机报错500
  9. nohup java_nohup
  10. matlab c1083,致命錯誤C1083:不能打開包含文件:'mexutils。沒有這樣的文件或目錄。...
  11. Android 封装标题栏
  12. 电商跟微商的区别是什么呢
  13. “金三银四” “阿里” 我去定了,谁也拦不住我,这份《Android面试宝典》说的
  14. 互联网晚报 | 8月15日 星期日 | 第四范式申请港交所上市;招行私人银行客户突破11万户;特斯拉CEO马斯克去年总薪酬为零...
  15. FTM(FlexTimerModule)TIMER总结
  16. 私有云服务器搭建及ssh连接
  17. php redis pipeline管道技术
  18. 唐端荣|DSP投放引擎的设计与实现
  19. ❤️交房步骤和注意事项❤️
  20. 多个表左连接LEFT JOIN

热门文章

  1. 重庆大学计算机学院王臣,重庆大学UMD研究生网络文化工作室学生干部述职大会暨换届选举大会圆满落幕...
  2. outlook 您的组织策略阻止我们为您完成此操作 解决办法
  3. 浏览器打开就是360导航(浏览器被360劫持)
  4. Octree 了然于胸
  5. 使用lgtm发现开源项目安全漏洞
  6. 数据结构之栈和队列(顺序栈、链栈、循环队列)
  7. 研究称纯电动汽车起火几率更低,但更难被扑灭
  8. 小福利,杨格(Young)不等式验证之用python里面的matplotlib和numpy模块画图
  9. “大数据杀熟”将被明令禁止:亚马逊才是大数据杀熟算法的鼻祖
  10. ElementUI插件引用