如何在调用自身的方法中使用ArrayList

时间:2014-12-13 19:20:42

标签: java recursion arraylist class-variables

我有一个名为FileUtils的类中实现的代码,它可以完成它的声音。 所有这一切都是通过一个文件并将该文件夹下的每个文件夹放在ArrayList中,所以就像在任何将返回内容的文件上调用.listFiles()方法一样。

private static ArrayList<File> classFileList = new ArrayList<File>();

public static ArrayList<File> listFiles(File dir) {
    if (!dir.isDirectory() || !dir.exists()) 
        return null;
    for (File file : dir.listFiles()) {
        classFileList.add(file);
        listFiles(file);
    }
    return classFileList;
}

上面的代码工作正常,但它需要一个类变量ArrayList才能工作。

如果我在方法中创建ArrayList,则每次调用它时都会重置,并且只返回最后一个文件。但是现在我已经设置了,如果我不止一次调用该方法,那么列表中包含每个文件的重复项。

使用方法变量的方法或在调用类变量后重置它。

3 个答案:

答案 0 :(得分:3)

您可以在函数内部创建局部变量,并在递归调用时为addAll创建:

public static List<File> listFiles(File dir) {
    List<File> result = new ArrayList<>();
    if (!dir.isDirectory() || !dir.exists()) 
        return result; // Alternatively: return Collections.emptyList();

    for (File file : dir.listFiles()) {
        result.add(file);
        result.addAll(listFiles(file));
    }
    return result;
}

答案 1 :(得分:2)

为您的方法添加参数列表并从其他方法调用它并在该方法中初始化新列表并将其传递给现有方法。公开新方法而不是现有方法: -

  public static ArrayList<File> listFilesWrapper(File dir){
     listFiles (dir , new ArrayList<File>());

   }

 public static ArrayList<File> listFiles(File dir,ArrayList<File> classFileList) {


if (!dir.isDirectory() || !dir.exists()) 
    return null;
for (File file : dir.listFiles()) {
    classFileList.add(file);
    listFiles(file , classFileList);
}
return classFileList;
}

答案 2 :(得分:1)

public static void listFiles(File dir, List<File> files) {
    if (!dir.isDirectory()) 
        return;
    for (File file : dir.listFiles()) {
        files.add(file);
        listFiles(file, files);
    }
}

然后要获取目录中所有文件的列表,请使用此代码;

List<File> files = new ArrayList<File>();
listFiles(dir, files); // Now the result is contained in files.