2014-12-13 7 views
2

У меня есть этот код, который реализован в классе под названием FileUtils, который делает то, на что это похоже. Все, что он делает - это файл и помещает каждую папку под этой папкой в ​​ArrayList, поэтому его можно вызвать метод .listFiles() в любом файле, который что-то вернет.Как использовать ArrayList внутри метода, который вызывает себя

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 внутри метода, он каждый раз возвращается в исходное состояние и возвращает только последний файл. Но с настройкой у меня сейчас, если я вызываю метод более одного раза, список содержит дубликаты каждого файла.

Любой способ использования переменной метода или сброс переменной класса после ее вызова.

ответ

2

Добавить список параметров для метода и вызывать его из другого метода и инициализировать новый список в этом методе и передать его к существующему методу. Expose нового метода вместо существующего: -

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; 
} 
+0

Да, это то, о чем я думал сразу после публикации, я просто сделал это, и он отлично работает, поэтому я считаю, что это хороший ответ, однако вам нужно передать classFileList и как параметр, когда он вызывается в цикле for. пока вы делаете это редактирование, я буду принимать это как ответ – Totalllyrandomguy

+0

@Totalllyrandomguy Done, спасибо, что указали это. На самом деле у меня не было java на этом компьютере, поэтому написал код в блокноте. И скопируйте эту часть с вашего вопроса. :-) – Panther

+0

Вам также нужно передать файл - listFiles() имеет 2 параметра! Также, если вы передаете classFileList в качестве параметра, метод должен, вероятно, иметь недействительный возвращаемый тип. –

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; 
} 
+0

Не будет ли это делать так, чтобы процессор был интенсивным, потому что вам нужно запустить метод, чтобы найти все файлы, а затем снова вызвать его для everyFile? – Totalllyrandomguy

+0

... так же, как OP - это не более интенсивный процессор. – Mureinik

+0

@ Пантера, это просто неправда. Подойдите ближе - последняя строка цикла for накапливает результаты. – Mureinik

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.