- 递归
递归
当前方法调用自身的现象
递归的分类
- 直接递归:方法自身调用自己
- 间接递归:方法A调用了方法B,方法A调用方法C,方法C反过来调用方法A
注意事项:
- 递归一定要有边界条件,确保递归能够停止,否则会发生栈溢出危险
- 在递归当中虽然有限定条件,但是递归的次数不能太多,否则也会发生栈溢出危险
- 构造方法不可递归
使用递归实现累加1-n求和
n + n-1 + ... + 1;
public static int sumByRecursion(int n) {
if (n == 1) {//结束条件
return 1;
}
return n + sumByRecursion(n - 1);
}
使用递归实现n阶乘
public static int multiplyByRecursion(int n) {
if (n == 1) {//结束条件
return 1;
}
return n * multiplyByRecursion(n - 1);
}
使用递归打印多级目录
//打印目录
System.out.println(file);
File[] files = file.listFiles();
for (File f : files) {
//判断 如果f为目录,继续向下遍历
if (f.isDirectory()){
count++;
printFileDirectory(f); //遍历该目录
}else{
System.out.println(" "+f);
}
}
//遍历查询.txt文件
for (File f : files) {
if (f.isDirectory()){
search(f);
}else{
if (f.getName().toLowerCase().endsWith(".txt")){
System.out.println(f);
}
}
}
文件过滤器
-
java.io.FileFilter
是一个接口,该接口的实现类对象可以传递给File类的listFiles(FileFilter filter)作为参数,接口当中只有一个方法:boolean accept(File pathname)
:测试pathname是否应该包含在当前的File目录中,如果符合返回true。 -
java.io.FilenameFilter
接口,实现此接口的类实例也是用于过滤文件名
boolean accept(File dir,String name)
:测试指定文件是否应该包含在某一文件列表中
File dir:构造方法中传递的被遍历的目录
String name:使用listFilter方法遍历目录,获取的每一个文件/文件夹的名称
注意:两个过滤器接口都没有实现类,需要我们自己定义实现类,重写accept方法,在方法中自定义过滤规则
File[] files = file.listFiles((File pathname) -> { //懒蛋表达式
if (pathname.isDirectory()) {//遍历文件夹
return true;
}
//return pathname.getName().toLowerCase().endsWith(".txt");//遍历文件
if (pathname.getName().toLowerCase().endsWith(".txt")) {
return true;
} else {
return false;
}
});
for (File f : files) {
if (f.isDirectory()) {
search(f);
} else {
//if (f.getName().toLowerCase().endsWith(".txt")){
System.out.println(f);
//}
}
}