如何将目录文件放在ArrayList中。
public void findFiles(String path) {
ArrayList<File> list = new ArrayList<File>();
File[] files = new File(path).listFiles();
for (File objects : files) {
if (objects.isFile()) {
list.add(objects);
}
//goes to the deeper layer
if (objects.isDirectory()) {
findFiles(objects.getAbsolutePath());
}
}
}
但是结尾文件的所有信息都会添加到列表(0)中。 下一步将找到重复项,我想通过比较数组来实现。
答案 0 :(得分:0)
您的方法只更新一个局部变量,一旦执行完成就会丢失。你应该以某种方式返回它,这样你就可以汇总结果,例如:
public List<File> findFiles(String path){
List<File> list = new ArrayList<File>();
File[] files = new File(path).listFiles();
for(File objects : files) {
if(objects.isFile()) {
list.add(objects);
}
//goes to the deeper layer
else if(objects.isDirectory()) {
list.addAll(findFiles(objects.getAbsolutePath()));
}
}
return list;
}
答案 1 :(得分:0)
您没有从递归调用中返回任何内容,因为您正在调用void
方法。您也没有在方法之外可访问的任何对象中设置值。
如果你不做这些事情,那么递归步骤的结果将永远不会保存在任何地方,并且递归中没有任何意义。
执行递归的正确方法是向下传递一个对象引用,每个向下步骤将填充该对象引用,然后在所有递归步骤返回后它将满,或者返回一个值,然后将返回的值与当前步骤的价值。
我将举一个第一种可能性的例子:
public void findFiles(String path, List<File> listToFill){
File[] files = new File(path).listFiles();
for(File objects : files) {
if(objects.isFile()) {
listToFill.add(objects);
}
//goes to the deeper layer
else if(objects.isDirectory()) {
findFiles(objects.getAbsolutePath(), listToFill);
}
}
}
在这种情况下,您必须先从顶层(或主要)调用它,首先初始化列表,然后将其传递下去(假设您的方法已将path
定义为顶层目录的路径,和obj
作为具有findFiles
方法的对象(您没有告诉我们它的名字)。
List<File> listOfFiles = new ArrayList<File>();
obj.findFiles( path, listOfFiles );