zoukankan      html  css  js  c++  java
  • day27 递归 文件过滤器

    今日内容

    • 递归

    • 文件过滤器

    递归

    自己指向自己,分为两类:直接递归和间接递归

    直接递归:称为方法自身调用自己的情况
    间接递归:可以归结为:方法A调用了方法B,方法B调用了方法C,C方法反过来又调用了方法A。

    注意事项:

    1.递归一定要有边界条件(条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
    2.在递归当中虽然有限定条件,但是递归的次数也不能太多,否则也会发生栈内存溢出的现象。
    3.构造方法禁止递归。

    递归求和(不推荐)

        public static void main(String[] args) {
            int sum = sum(3);
            System.out.println(sum);// 6
        }
        /*
            定义一个方法:使用递归操作 实现;累加和
            1 + 2 + 3 + 4 + .... + n
            n + (n-1) + (n-2) + (n-3) + ... + 1
            已知:
               最大值:n
               最小值:1
            使用递归必须明确:
               1.递归的结束条件:获取到1的时候结束
               2.递归的目的:获取下一个被加的数字(n-1)
         */
        public static int sum(int n) {
            if (n == 1) {
                return  1;
            }
            return n + sum(n-1);
        }

    求阶乘

        public static void main(String[] args) {
            int summ =  summ(4);
            System.out.println(summ);//24
        }
    //获取阶乘
        public static int summ(int n){
            if (n==1){
                return 1;
            }
            return  n*summ(n-1);
        }

    递归遍历目录:

        public static void main(String[] args) {
            // 找到Hello文件的路径
            File file = new File("C:\Users\admin\Desktop\Hello");
            //调用getAllFiles()
            getAllFiles(file);
        }
    
        public static void getAllFiles(File file) {
            // 表明file此时是一个目录
            System.out.println(file);
            //首先先获取到它直接子目录和直接子文件
            File[] files = file.listFiles();
            // 遍历files目录
            for (File f : files) {
                // 判断如果得到的f是一个目录,需要再次遍历
                if (f.isDirectory()) {
                    // 表明f是一个目录,则继续遍历这个目录
                    //getAllFiles方法就是获取所有的文件,参数传递的刚好是目录。所以直接调用getAllFiles:递归(自己调用自己)
                    getAllFiles(f);
                   /* File[] files1 = f.listFiles();
                    for (File file1 : files1) {
                    }*/
                } else {
                    // 此时f不是一个目录,肯定是一个文件
                    System.out.println(f);
                }
            }
        }

    遍历txt文件

        public static void main(String[] args) {
            //构建一个File对象得到C:UsersadminDesktopHello路径
            File file = new File("C:\Users\admin\Desktop\Hello");
            getAllTxt(file);
        }
    
        /*
            定义一个方法,遍历所有的.txt文件
            方法中依然需要传参数目录
         */
        public static void getAllTxt(File dir) {
            //System.out.println(dir);
            File[] files = dir.listFiles();
            //遍历files
            for (File f : files) {
                // 判断f是否是一个目录
                if (f.isDirectory()) {
    
                    getAllTxt(f);
                } else {
                    // 先获取文件的名称
                   /* String name = f.getName();
                    //String path = f.getPath();
                     // 大写字符串转换成小写
                     name = name.toLowerCase();
                    // 再次判断名称是否以.txt结尾
                    if (name.endsWith(".txt")) {
                        System.out.println(f);
                    }*/
                    // 链式编程
                    if (f.getName().toLowerCase().endsWith(".txt")) {
                        System.out.println(f);
                    }
                }
            }
        }

    文件过滤器

    java.io.FileFillter是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口当中只有一个方法:
    boolean accept(File pathname) :  测试pathname是否应该包含在当前的File目录中,如果符合返回true

    例题:

    实现接口
    public class FileFilterImpl implements FileFilter {
            /*
                过滤的规则:
                    在accept方法中,判断File类对象是否以.txt结尾
                    是就返回true
                    不是就返回false
                    如果此File对象是一个文件夹,则返回true,继续遍历这个文件夹
             */
            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory()) {
                    return true;
                }
                return pathname.getName()
                        .toLowerCase()
                        .endsWith(".txt");
            }
    }
    
    定义类
    public class Demo06Recursion {
    
        public static void main(String[] args) {
            //构建一个File对象得到C:UsersadminDesktopHello路径
            File file = new File("C:\Users\admin\Desktop\Hello");
            getAllTxt(file);
        }
    
        /*
            定义一个方法,遍历所有的.txt文件
            方法中依然需要传参数目录
         */
        public static void getAllTxt(File dir) {
            //System.out.println(dir);
            //File[] files = dir.listFiles();
            File[] files = dir.listFiles(new FileFilterImpl());
            //遍历files
            for (File f : files) {
                // 判断f是否是一个目录
                if (f.isDirectory()) {
                    getAllTxt(f);
                } else {
                    // 先获取文件的名称
                    System.out.println(f);
                }
            }
        }
    }
  • 相关阅读:
    二分图最大匹配的König定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/rxqq/p/14136374.html
Copyright © 2011-2022 走看看