Java 递归文件列表检查正在返回重复项

Java 递归文件列表检查正在返回重复项,java,file,recursion,duplicates,duplicate-removal,Java,File,Recursion,Duplicates,Duplicate Removal,我创建了一个方法,它遍历并查找给定目录中的每个文件,然后检查它是否满足FileFilter的要求,并返回数组列表中的所有文件 public static ArrayList<File> listFiles(File dir, FileFilter filter) { ArrayList<File> files = new ArrayList<File>(); if (filter == null) files = listFil

我创建了一个方法,它遍历并查找给定目录中的每个文件,然后检查它是否满足FileFilter的要求,并返回数组列表中的所有文件

public static ArrayList<File> listFiles(File dir, FileFilter filter) {
    ArrayList<File> files = new ArrayList<File>();
    if (filter == null)
        files = listFiles(dir, files);
    else
        files = listFiles(dir, filter, files);
    return files;
}

private static ArrayList<File> listFiles(File dir, ArrayList<File> files, FileFilter filter) {
    if (!dir.isDirectory() || !dir.exists()) 
        return null;
    for (File file : dir.listFiles()) {
        System.out.println(file);
        if (filter.accept(file))
            files.add(file);
        listFiles(file, filter, files);
    }
    return files;
}
最后四个文件是前四个文件的副本。它的失败也是意料之中的,只有前4行文件被添加了两次(因此,如果在目录结束之前一行中只有2个文件,那么只有2个文件会被复制)

directoryFilter是结果中没有实际的.txt文件的原因。

您的代码适合我(在修复了错误并进行了一些清理之后)

import java.io.*;
导入java.util.*;
公共类文件树{
公共静态void main(字符串[]args){
System.err.println(listFiles(新文件(args[0]),新文件筛选器(){
@重写公共布尔接受(文件路径名){
返回true;
}
}));
}
公共静态ArrayList列表文件(文件目录、文件过滤器){
ArrayList files=新的ArrayList();
列表文件(目录、文件、过滤器);
归还文件;
}
私有静态无效列表文件(文件目录、ArrayList文件、文件过滤器){
如果(!dir.isDirectory()){
返回;
}
对于(文件:dir.listFiles()){
if(filter.accept(文件)){
文件。添加(文件);
}
列表文件(文件、文件、过滤器);
}
}
}

请添加listFiles方法,该方法将3个参数添加到您的帖子中。好的,我添加了可能有用的代码块。您粘贴的内容有错误。方法签名与您的调用不匹配,而且看起来您已经把事情复杂化了。清理您的代码并在这里发布工作示例,否则您将得不到任何帮助…我在粘贴到这里的内容中发现的唯一错误是参数不匹配,所有内容都是导入和名称更改…您能解释一下吗?我想我忽略了差异,以及为什么这种差异对你有效…这几乎是你的代码。。。我将3 arg
listFiles
方法更改为返回
void
,因为文件列表已作为参数传递。结束递归的'dir.exists'检查似乎是多余的——如果它是一个目录,那么它也必须存在。我添加了大括号,以便更清楚地了解
if
语句中的块是什么。我添加了
import
语句和一个main方法,以便运行代码。我添加了一个接受所有文件的过滤器,因为您的代码无法处理
null
过滤器。你对代码有什么具体的问题吗?是的,当我把你的代码复制粘贴到我的IDE中时,它工作了,但当我对代码进行更改时,它没有。。。我会再胡闹一点,看看我能不能找到原因,如果不能,我会更新OP。。。顺便说一句,在你改变我的代码之前,你有和我一样的问题吗?哦,没关系,哈哈。。。我遇到的问题来自另一个写得不正确的方法,我在上面的方法之后直接调用了这个方法。。。现在我觉得有点傻。看起来OP中的代码工作得很好。。。但是无论如何,请把你的答案标记为正确谢谢你的帮助。@TotallyRandomGuy这就是人们要求
ArrayList<File> files = listFiles(new File("Notes"), new DirectoryFilter());
Notes/JavaNotes
Notes/JavaNotes/java
Notes/JavaNotes/java/io
Notes/JavaNotes/java/io/File
Notes/JavaNotes/java/io/IOException
Notes/JavaNotes/java/util
Notes/JavaNotes/java/util/ArrayList
Notes/JavaNotes/javax
Notes/JavaNotes/javax/swing
Notes/JavaNotes/javax/swing/JFrame
Notes/JavaNotes
Notes/JavaNotes/java
Notes/JavaNotes/java/io
Notes/JavaNotes/java/io/File
import java.io.*;
import java.util.*;

public class FileTree {
    public static void main(String[] args) {
         System.err.println(listFiles(new File(args[0]), new FileFilter() {   
            @Override public boolean accept(File pathname) { 
                return true;
            }
         }));
    }

    public static ArrayList<File> listFiles(File dir, FileFilter filter) {
         ArrayList<File> files = new ArrayList<File>();
         listFiles(dir, files, filter);
         return files;
    }

    private static void listFiles(File dir, ArrayList<File> files, FileFilter filter) {
        if (!dir.isDirectory()) {
             return;
        }
        for (File file : dir.listFiles()) {
            if (filter.accept(file)) {
                 files.add(file);
            }
            listFiles(file, files, filter);
        }
    }
}