0224递归 ,斐波那契数列
1、过滤器
要筛选出符合规则的文件,就要用到过滤器
FileFilter文件过滤器,这个类中有一个accept(String p)方法,用于写过滤文件的规则
因为FileFilter是一个接口 所以不能创建实体类对象,所以我们要自己创建一个类 来实现这个接口去重写这个accept方法
代码展示(该规则 筛选文件以TXT结尾)
public boolean accept(File pathname) { if(pathname.isFile()){ //获取文件名 String name=pathname.getName(); //将文件名转为小写 name=name.toLowerCase(); //判断文件名是否以txt结尾 Boolean flag=name.endsWith(".txt"); }else{ return false; } 以上if判定中可以用一句话写出 return pathname.getName().toLowerCase().endsWith(".txt");
那么规则创建完毕我们只需要在获取文件类对的时候将这个规则传入
代码展示
public static void main(String[] args) { //明确文件夹位置 File file=new File("F:\\io1127"); //获取该文件夹中符合规则的文件 File[] files=file.listFiles(new Myfilter()); //遍历 for(File f:files){ System.out.println(f); } } 运行结果为 F:\io1127\demo01.txt F:\io1127\demo02.txt F:\io1127\demo03.TXT
注:上述过滤只筛选了一层文件夹的文件
图解
2、递归
若我们想筛选所有文件夹下的文件,那我们就要用到递归
首先展示一下简单的递归代码
public static void main(String[] args) { a(); } public static void a(){ System.out.println("aa"); a(); }
递归说白了就是自己调用自己,上述代码中没有一个程序的出口 所以就造成堆栈的问题造成数据存储溢出,所以我们要在用递归的时候要在合适的地方给程序一个出口
例,用递归写一个求1-100的和
public static int get(int n){ if(n==1){ return 1; } return n+get(n-1); } 规律:100+(100-1)+(99-1)+...+1
图解
著名的递归例子:斐波那契数列
一对兔子,从第三个月开始每个月生一对兔子,问一年总共几对兔子
//斐波那契数列 public static int get1(int n){ if(n==1){ return 1; } if(n==2){ return 1; } return get1(n-1)+get1(n-2); }
图解
我们要查询所有文件,并不是只查询一层文件
//获取某文件夹下的文件和文件夹 public static void get(File path){ System.out.println("---"+path+"---"); //获取该目录下的文件和文件夹对象数组 File[] files=path.listFiles(); for(File f:files){ //判定如果是文件夹就继续遍历下一集目录 if(f.isDirectory()){ get(f); }else{ System.out.println(f); } } } public static void main(String[] args) { get(new File("F:\\io1127")); } 运行结果 ---F:\io1127--- ---F:\io1127\a--- ---F:\io1127\a\b--- ---F:\io1127\a\b\c--- ---F:\io1127\a\b\c\d--- F:\io1127\a\b\c\d\ja.java F:\io1127\a\b\c\d\nihao.txt F:\io1127\a\b\c\va.java F:\io1127\a\b\d.txt F:\io1127\a\b\ja.java F:\io1127\a\java.java F:\io1127\demo01.txt F:\io1127\demo02.txt F:\io1127\demo03.TXT ---F:\io1127\work1--- ---F:\io1127\work1.txt---
这个时候就查询出了所有的文件和文件夹,那我们如果要筛选以txt结尾的文件呢,
首先创建一个规则,这时候如果判定他是文件夹,我们就要给他放过
public boolean accept(File pathname) { //如果是文件夹就直接通过 if(pathname.isDirectory()){ return true; } return pathname.getName().toLowerCase().endsWith(".txt"); }
public static void main(String[] args) { get(new File("F:\\io1127")); } //获取某文件夹下的文件和文件夹 public static void get(File path){ //获取该目录下的文件和文件夹对象数组 File[] files=path.listFiles(new Myfilter()); for(File f:files){ //判定如果是文件夹就继续遍历下一集目录 if(f.isDirectory()){ get(f); }else{ System.out.println(f); } } } 运行结果 F:\io1127\a\b\c\d\nihao.txt F:\io1127\a\b\d.txt F:\io1127\demo01.txt F:\io1127\demo02.txt F:\io1127\demo03.TXT