Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取结构中无递归的文件数_Java_File - Fatal编程技术网

Java 获取结构中无递归的文件数

Java 获取结构中无递归的文件数,java,file,Java,File,是否可以获得文件夹(以及所有子文件夹)中的文件总数,而无需迭代所有文件并递归深入 我的意思是这确实很容易,但也许有更好的解决方案 private int totalFileCounter = 0; private void countFiles(File f) { if (f.isDirectory()) { for (File fi : f.listFiles()) { countFiles(fi); } } else

是否可以获得文件夹(以及所有子文件夹)中的文件总数,而无需迭代所有文件并递归深入

我的意思是这确实很容易,但也许有更好的解决方案

private int totalFileCounter = 0;

private void countFiles(File f) {
    if (f.isDirectory()) {
        for (File fi : f.listFiles()) {
            countFiles(fi);
        }
    } else {
        totalFileCounter++;
    }
}
编辑:好吧,也许我的问题问得不太好。。。我的意思是,java、文件系统或其他东西是否有任何功能允许我获得O(1)中的文件总数?如果所有解决方案现在都有运行时O(n)。

是,使用a进行迭代。以下是一个示例(未经测试):

private void countFiles(文件f){
Queue Queue=new LinkedList();
添加(f);
而(!queue.isEmpty()){
File File=queue.poll();
if(file.isDirectory()){
queue.addAll(Arrays.asList(file.listFiles());
}否则{
totalFileCounter++;
}
}
}

通常最简单的解决方案是最好的。我不会使用字段来计算应该是函数的结果。如果同时从两个线程调用该方法,则可能会得到错误的结果

static int countFiles(File f) {
    if (f.isDirectory()) {
        int sum = 0;
        for (File fi : f.listFiles()) 
            sum += countFiles(fi);
        return sum;
    }
    return 1;
}

这能达到你的目的吗。它返回
集合

不,没有递归就不能执行(除非将递归转换为循环,但这只是隐藏递归)。我会将
totalFileCounter
作为局部变量。@PeterLawrey:我同意,但是OP的方法返回类型是
void
,所以我想他总是想更新实例变量
totalFileCounter
。。。该方法不必是线程安全的,但如果是,它总是更好:)但我认为它在内部也会执行某种递归/堆栈/队列来提供这个集合?然后,它也将运行在O(n)和将是非常耗时的一些文件夹…我会接受你的代码清洁和风格的解决方案:)谢谢!
static int countFiles(File f) {
    if (f.isDirectory()) {
        int sum = 0;
        for (File fi : f.listFiles()) 
            sum += countFiles(fi);
        return sum;
    }
    return 1;
}