有没有办法将ArrayList作为一个局部变量


public static ArrayList<String> searchFiles(File currentFolder) throw NotDirectoryException {
ArrayList<String> result = new ArrayList<String>();
if(!currentFolder.isDirectory())
throw new NotDirectoryException("File is not a directory");
File[] direct = currentFolder.listFiles();
if(direct!=null) {
for (int i = 0; i< direct.length; i++){
if(direct[i].isDirectory())
searchFiles(direct[i]);
if(direct[i].isFile()&&!direct[i].isHidden())
result.add(direct[i].getName());
}
}
return result;
}

此代码的目的是搜索所有目录和子目录,然后递归地将符合条件的文件添加到arraylist中。如果我从方法中删除ArrayList声明,并将其作为全局变量,则代码运行良好,它将正确地将目录中的所有文件添加到ArrayList中。如果我把它作为一个局部变量,它只会添加根文件夹中的文件,而不会添加其他文件。有没有一种方法可以在使代码工作的同时保持ArrayList作为局部变量?

您可以将ArrayList传递给递归调用,如下所示:

public static ArrayList<String> searchFiles(File currentFolder, ArrayList<String> result) throw NotDirectoryException {
if(!currentFolder.isDirectory()) 
throw new NotDirectoryException("File is not a directory");
File[] direct = currentFolder.listFiles();
if(direct!=null) {
for (int i = 0; i< direct.length; i++){
if(direct[i].isDirectory())
searchFiles(direct[i], result);
if(direct[i].isFile()&&!direct[i].isHidden())
result.add(direct[i].getName());
}
}
return result;
}

请注意,当您将result声明为局部变量时,它将在方法返回后被销毁。为了保留其值,可以在递归调用方法时将其作为参数传递。

您所需要做的就是在递归中正确使用searchFiles的返回值。例如,代替

searchFiles(direct[i]);

写入

result.addAll(searchFiles(direct[i]));

在其他答案中递归传递可变的ArrayList更有效,但更令人困惑,并且最好与不带ArrayList参数的方法的公共重载配对。此外,这将违反问题的标题,该标题指定ArrayList应保持为局部变量。

在数组列表中传递。原始调用方将传入一个新的ArrayList((

相关内容

最新更新