Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 如何在调用自身的方法中使用ArrayList_Java_Recursion_Arraylist_Class Variables - Fatal编程技术网

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

Java 如何在调用自身的方法中使用ArrayList,java,recursion,arraylist,class-variables,Java,Recursion,Arraylist,Class Variables,我有这段代码,它是在一个名为FileUtils的类中实现的,这个类的作用与它的发音类似。 它所做的只是遍历一个文件,并将该文件夹下的每个文件夹都放在数组列表中,因此这就像对任何将返回内容的文件调用.listFiles()方法一样 private static ArrayList<File> classFileList = new ArrayList<File>(); public static ArrayList<File> listFiles(File d

我有这段代码,它是在一个名为
FileUtils
的类中实现的,这个类的作用与它的发音类似。 它所做的只是遍历一个文件,并将该文件夹下的每个文件夹都放在
数组列表中
,因此这就像对任何将返回内容的文件调用
.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;
}
private static ArrayList classFileList=new ArrayList();
公共静态ArrayList列表文件(文件目录){
如果(!dir.isDirectory()| |!dir.exists())
返回null;
对于(文件:dir.listFiles()){
classFileList.add(文件);
列表文件(文件);
}
返回类文件列表;
}
上面的代码工作正常,但需要类变量
ArrayList
才能工作

如果我在方法中创建
ArrayList
,那么每次调用它时它都会被重置,并且只返回最后一个文件。但是在我现在的设置中,如果我多次调用该方法,那么列表中包含每个文件的副本


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

您可以在函数内部创建局部变量,并在递归调用时向其添加所有变量:

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;
}
公共静态列表列表文件(文件目录){
列表结果=新建ArrayList();
如果(!dir.isDirectory()| |!dir.exists())
return result;//或者:return Collections.emptyList();
对于(文件:dir.listFiles()){
结果.添加(文件);
addAll(listFiles(file));
}
返回结果;
}

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

  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;
}
publicstaticarraylistlistfileswapper(文件目录){
列表文件(dir,newarraylist());
}
公共静态ArrayList列表文件(文件目录,ArrayList类文件列表){
如果(!dir.isDirectory()| |!dir.exists())
返回null;
对于(文件:dir.listFiles()){
classFileList.add(文件);
列表文件(文件,类文件列表);
}
返回类文件列表;
}
公共静态无效列表文件(文件目录,列表文件){
如果(!dir.isDirectory())
返回;
对于(文件:dir.listFiles()){
文件。添加(文件);
列表文件(文件,文件);
}
}
然后使用此代码获取目录中所有文件的列表

List<File> files = new ArrayList<File>();
listFiles(dir, files); // Now the result is contained in files.
List files=new ArrayList();
列表文件(目录,文件);//现在,结果包含在文件中。

这样做不会占用大量处理器,因为您需要运行该方法来查找所有文件,然后为每个文件再次调用它?。。。和OP一样——这不再是处理器密集型的了。@Panther,这根本不是真的。仔细看一看——for循环的最后一行累积了results@Panther当然,我做过测试。是吗?每次调用都会重新定义局部变量-它们不会“重置”,它们只是不同的变量。请在发出这样的声明之前试着运行这个。你们能编辑这个问题吗,比如添加一些空格。我喜欢取消我的否决票,实际上也投了一票。它对我来说是锁定的,这是我在发布后立即想到的,我刚刚做了,它工作得很好,所以我认为这是一个很好的答案,但是当在for循环中调用它时,您需要传递classFileList并将其作为参数。只要你做了那次编辑,我就接受这一点answer@Totalllyrandomguy好的,谢谢你指出。实际上我在这台计算机上没有java,所以我用记事本写代码。并从你的问题中复制粘贴该部分。:-)您还需要传递文件-listFiles()有2个参数!另外,如果要将classFileList作为参数传递,则该方法可能应该具有void return type。不,它不应该具有void return type,因为该方法在需要它的单独类表单中出现。所以它需要在内部创建一个arrayList,然后需要将它返回到调用它的地方。
List<File> files = new ArrayList<File>();
listFiles(dir, files); // Now the result is contained in files.