您的位置:首页 > 编程语言 > Java开发

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

2016-07-22 00:00 741 查看
练习题目代码如下:

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);
}
}


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

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

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

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

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

经验还是很欠缺,脑子也不行啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: