java计算参数目录大小的递归和迭代实现

15 篇文章 0 订阅

练习题目代码如下:


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Created by longforus on 8:50 PM 5/11/2016 .
 * IDEA-Chapter20_28 .
 * 把目录或文件作为参数传入 求其大小
 */


public class Chapter20_28 {
    public static void main (String[] args) throws IOException {
        System.out.println (getFormatSize (getSize (new File (args[0]))));
    }


//    public static long getSize (File file) {//递归求文件夹的大小
//        long size = 0;
//        if (file.isDirectory ()) {
//            File[] files = file.listFiles ();
//            for (int i = 0; i < files.length; i++) {
//                size += getSize (files[i]);
//            }
//        } else {
//            size += file.length ();
//        }
//        return size;
//    }

    public static long getSize (File file) {//迭代实现
        long size = 0;
        ArrayList<File> list = new ArrayList<> ();//运用了栈的原理
        if (file.isDirectory ()) {
            addToList (list, file);//是目录就把子目录入栈
        } else {
            size += file.length ();//是文件就加入总size内
        }
        while (! list.isEmpty ()) {//只要栈不空
            File temp = list.remove (list.size () - 1);//取出栈顶处理
            if (temp.isDirectory ()) {
                addToList (list, temp);
            } else {
                size += temp.length ();
            }
        }
        return size;
    }

    public static void addToList (ArrayList<File> list, File file) {//把file的内容入栈
        File[] files = file.listFiles ();
        for (int i = 0; i < files.length; i++) {
            list.add (files[i]);
        }
    }
    public static String  getFormatSize(long size){//得到格式化字符串
        double tempSize = size;
            int n = 0;
        String unit = "Byte";
        while (tempSize > 1024) {
            tempSize/=1024;
            n++;
        }
        switch (n) {
            case 1:
                unit = "KByte";
                break;
            case 2:
                unit = "MByte";
                break;
            case 3:
                unit = "GByte";
                break;
        }
            return  String.format ("%.2f%s",tempSize,unit);
    }
}


在这个例子中,递归实现确实比迭代实现要简单一些,

在自己实现迭代的时候,起先想到用树型结构,但是后面觉得空间的复杂度和遍历方面不是很理想,

后来想了一下想到了这个方法用栈来实现确实是比较理想的

应该还有更好的实现方法,原谅我还没有想到,

因为这个例子让我想了好久,才想到这个方法所以记在這里

经验还是很欠缺,脑子也不行啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值