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((