遍历:广度优先与深度优先

广度优先(以获取文件夹中所有文件为例)

第一步,创建队列,元素操作规则为:队列尾部加入元素,头部移除元素
第二步,把文件夹加入该队列
第三步,从该队列头移除文件夹,同时依次遍历它的所有孩子,如果孩子是文件,则提取;
       如果孩子是文件夹,则加入队列尾部
第四步,重复第三步;直到队列为空为止。到此文件夹中所有文件都被获取
//获取文件夹下所有文件
public List<File> getFolderFiles(String folderName){
    File folder = new File(folderName);
    //保存结果
    List<File> list = new ArrayList<>();
    //记录当前要遍历的文件夹,广度优先遍历
    LinkedList<File> currentFolders = new LinkedList<>();
    //把要遍历的文件夹加入队列
    currentFolders.addLast(folder);
    while (!currentFolders.isEmpty()){
        //从队列头拿出待遍历文件夹,如果其孩子是文件夹则加入队列尾部
        File f = currentFolders.removeFirst();
        File[] files = f.listFiles();
        if (files != null && files.length > 0){
            for (File file : files) {
                if (file.isDirectory()){
                    currentFolders.addLast(file);
                }else {
                    list.add(file);
                }
            }
        }
    }
    return list;
}

深度优先(以删除文件夹folder0为例)

第一步,创建栈

第二步,文件夹folder(0)入栈

第三步,peek方式遍历栈顶文件夹,即只读数据,不出栈,如果第一个遍历到的孩子是文件,则直接删除,然后继续遍历;如果第一个遍历到的孩子是文件夹folder(1),则先暂停遍历folder(0),同时把folder(1)入栈,此时,栈中有两个元素,栈顶为folder(1),栈底为folder(0)

第四步,重复第三步,直到folder(N)为空,此时,删除folder(N),同时folderN出栈,此时,栈顶元素为folder(N-1),由于删除folder(N)时,暂停了folder(N-1)的遍历,那么现在folder(N)处理完成了,就继续folder(N-1)的遍历……直到处理完folder(N-1)的所有孩子,folder(N-1)为空,删除folder(N-1),同时folder(N-1)出栈

第五步,执行完以上所有步骤,就处理完了folder(0)所有的孩子,folder(0)为空,删除folder(0),folder(0)出栈,到此删除文件夹folder(0)完成
这里写图片描述

//深度优先遍历删除文件夹
public void deleteFolder(File folder){
    //创建堆栈,记录当前要删除的文件夹
    Stack<File> deleteStack = new Stack<>();
    //将要删除的目标先入栈记录起来
    deleteStack.push(folder);
    //只要堆栈非空,深度优先遍历就没有结束
    while (!deleteStack.isEmpty()){
        //peek表示读取栈顶元素,不将该元素移除栈顶
        File[] files = deleteStack.peek().listFiles();
        if (files !=null && files.length > 0){
            for (File file : files) {
                if (file.isDirectory()){
                    deleteStack.push(file);
                }else {
                    file.delete();
                }
            }
        }
        //检测栈顶元素是否为空,为空则表示该文件夹中的孩子已经全部删除
        File[] temp = deleteStack.peek().listFiles();
        if (temp == null && temp.length == 0){
            //把该文件夹移除栈顶,并删除该文件夹
            deleteStack.pop().delete();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值