java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能

现在有这样一个需求,给你一个目录,需要你在此目录中查找全部名字中包含指定字符的文件。

这题的主要难点在于:目录中可能包含子目录,子目录中又会包含子目录。而我们事先没办法确定子目录到底有多少层!这时候就需要用到递归算法了。

5c0ded8ee975221baf2108018e88bbcb.png

说起递归,通过一个例子相信大家并不难理解。我们小时候都听过一个故事:从前有座山,山里有座庙,庙里有个老和尚,老和尚在给大家讲故事。故事的内容是这样的:从前有座山,山里有座庙,庙里有个老和尚,老和尚在给大家讲故事。故事的内容是这样的:从前有座山......

我们都知道,以上的故事就是在无限循环。从编程的角度来说,这就是典型的死循环。而递归其实和这个类似,也是一个无限循环过程。但递归和死循环之间有一个非常重要的特征:那就是终止条件。我们都知道,死循环是没办法结束的,所以称之为死循环。但递归是有终止条件的,只要这个条件满足,递归的循环就会立即结束。所以你也可以简单的把递归理解为可以结束的无限循环(之所以称之为无限循环,是因为我们谁也不能确定这个终止条件什么时候会发生,也就是事先谁也不确定这个循环会执行多少次,反正只是知道他能结束就对了)。如果你恰好有这样的场景,那么不用怀疑,你需要使用递归算法来完成你的工作!

622034ceb678ee6e96c1e4315a6a21e9.png

上面的需求正好就满足这个递归的场景。因为我们需要到目录中查找文件,而一个目录中可能有文件,也可能会有子目录,子目录中也是同样的情况。这就形成了一个循环,即在一个目录中检查文件和子目录。如果此目录中出现了子目录,需要重复以上动作。使用递归的原因在于,虽然我们可以重复以上的动作,但我们并不确定子目录到底会存在多少层。所以事先并不知道我们的循环会执行多少次。但我们循环结束的条件是确定的,即当查找到某个目录的时候,如果此目录中没有子目录了,那我们的循环就可以结束了。以上就是递归算法在本例当中的使用分析,下面我们通过代码来实现这个过程:

打开Eclipse,新建一个Java Project,命名为recursion.

在src中新建包file--新建类Search.java

本次实例我们在D盘新建目录test,然后我们在此目录内查找名称中含"hello"的全部文件,d:est目录的结构是这样的:

D:est

------a(folder)

--------my(folder)

-------new(folder)

-------hellofy.java

-------这是hello.txt

--------hello.sql

说明:1、test目录下有目录a

2、a 目录下有目录my和文件hello.sql

3、my目录下有目录new和文件 这是hello.txt

4、new目录下有文件 hellofy.java

0685ff1f4a044fe0b3daca846e85829a.png

程序所使用的目录结构

我们的程序指定到目录D:est,需要找到此目录中包含hello的文件,代码如下:

package file;import java.io.*;public class Search {/// 要查找的文件名(包含)private String containFileName = "hello";/** * 递归查找指定文件夹内含指定文件名的文件 *  * @param path */public void findChild(String path) {      File file = new File(path);      File[] children = file.listFiles();///得到此目录内的全部文件与子目录列表      if (children != null) {             for (File item : children) {                   if (item.isDirectory()) {//如果是目录,继续调用自身方法,实现递归调用                          findChild(item.getAbsolutePath());// 递归调用方法本身,将当前子目录作为参数传递进去                   } else {                         if (item.getName().contains(containFileName)) {                               System.out.println("找到文件:" + item.getAbsolutePath());                          }                   }              }       }}       public static void main(String[] args) throws Exception {      Search test = new Search();      test.findChild("d:est");     }}

运行以上代码,得到结果:

找到文件:d:estahello.sql

找到文件:d:estamyewhellofy.java

找到文件:d:estamy这是hello.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值