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);
                }
            }
        }
    }
  • 相关阅读:
    卡尔曼滤波器的简单推导
    data_quick 进度
    面试
    MapServer+TileCache+Apache+Python24 构建KS数据服务器
    PYTHONPATH 可以跨版本 方便使用 (本文为windows方法)转~
    20130923
    20130909
    error C2504 类的多层继承 头文件包含
    int long 等基础类型在不同平台的大小
    mysql python image 图像存储读取
  • 原文地址:https://www.cnblogs.com/rxqq/p/14136374.html
Copyright © 2011-2022 走看看