今日内容
-
递归
-
文件过滤器
递归
自己指向自己,分为两类:直接递归和间接递归
直接递归:称为方法自身调用自己的情况
间接递归:可以归结为:方法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); } } } }