2012-06-20 3 views
1

Я знаю основы рекурсии, но в данном коде я сталкиваюсь с трудностями, чтобы понять поток.
пожалуйста, помогите мне, ребята ...понимание потока RECURSION

public ArrayList<String> searchFolders(File fo) { 

    if (fo.isDirectory()) { 

     String internalNames[] = fo.list(); 



     for (int i = 0; i < internalNames.length; i++) { 
      searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i])); 
      path = fo.getAbsolutePath() + "\\" + internalNames[i]; 
     } 
    } 
    if (fo.isFile()) { 

     alist.add(fo.toString()); 


    } 


    return alist; 
} 
+3

Вы попробовали отслеживать его с помощью отладчика? –

+1

Какую часть вы не поняли? – Crazenezz

+1

См. [Этот вопрос] (http: // stackoverflow.com/questions/11116157/understanding-flow-of-recursion) для дополнительной помощи ... Я должен сказать, что это один из худших рекурсивных сканеров каталогов, которые я когда-либо видел. – Alnitak

ответ

2

В принципе, этот код получает все содержимое каталога и добавляет их к глобальной переменной alist.

Вы даете ему справочник. Если это файл, он добавляет его имя в список и возвращает метод (файлы не могут иметь подпапки).

Если это папка, то в нем перечислены все вещи в папке:

String internalNames[] = fo.list(); 

И затем выполняет тот же поиск для каждого элемента в папке:

searchFolders(new File(fo.getAbsolutePath() + "\\"+ internalNames[i]));

So , если элемент, который вы сейчас ищете, является файлом (если fo.getAbsolutePath() + "\\"+ internalNames[i] - это каталог файла), то он просто добавляет файл в глобальный ArrayList.

В противном случае, если это папка, она ищет его точно так же, как он просто искал папку, на которую он просто смотрит, и перечисляет все файлы в папке.

Вы, кажется, не используете переменную path.

Когда вы возвращаете alist, вы возвращаете все файлы, которые вы нашли в папке (и ее подпапках). Вы не возвращаете имена папок, поскольку с fo.isDirectory() вы не добавляете свое имя в alist.

enter image description here

+0

привет. Я знаю, что он делает, но я путаюсь, что поток означает, что ll b является формой стека и что будет b последовательностью выполнения. – ASH

+0

Это зависит от порядка 'internalNames'. Если сначала 'innerNames' - это папки, тогда поиск будет сбрасываться по всем уровням папок до тех пор, пока не будет больше подпапок, а затем он будет искать файлы. – eboix

+0

предположим, что изначально fo имеет путь к каталогу и содержит 8 папок. то первое условие if ll b true nd, тогда цикл for ll b встречается, а затем снова находит searchfolder() ll b и теперь предположим, что это первое внутреннее имя является файлом. поэтому первое условие if ll b false nd so 2nd, если ll встретится с файлом ll b, добавьте в «alist», теперь мой вопрос: будет ли оператор возврата работать, и да, тогда где будет двигаться контроллер? надеюсь, что вы получите мое замешательство ... – ASH

1

Рассмотрим этот рекурсии код в виде дерева проводника. Метод searchFolders будет проверять каждый файл/папку, присутствующую в текущем каталоге, и составить его список, поэтому вы можете сказать, что он берет всех детей из корневого узла.

После списка он будет называть себя в каждом дочернем узле корневого узла (для поиска снова для папок и файлов) и обновить путь, чтобы узнать, где он находится.

Он остановится, когда обнаружит все дочерние узлы (даже до n уровней), у которых нет папок для поиска, но только файлы.

0

для краткости, рассмотреть выход рекурсии:

if (fo.isFile()) { 

    alist.add(fo.toString()); 


} 

когда fo является файл, добавьте путь к файлу alist и выхода; Если это неверно для этого условия выхода из рекурсии, fo - это каталог, а затем возвращается к выходу recursion --- 'fo' - это файл.

так что этот способ searchFolders найти каждый файл в папке и подпапке, вернуть их имя в список!