Перед тем, как отладить функцию рекурсивной функции с поздним вылетом: есть ли команда для получения субдиров? giveMeSubDirs(downToPath)
?Java: как получить все поддиры рекурсивно?
// WARNING: RECURSION out of bound or too much data
public HashSet<FileObject> getAllDirs(String path) {
HashSet<FileObject> checkedDirs = new HashSet<FileObject>();
HashSet<FileObject> allDirs = new HashSet<FileObject>();
String startingPath = path;
File fileThing = new File(path);
FileObject fileObject = new FileObject(fileThing);
for (FileObject dir : getDirsInDir(path)) {
// SUBDIR
while (!checkedDirs.contains(dir)
&& !(getDirsInDir(dir.getFile().getParent()).size() == 0)) {
// DO NOT CHECK TOP DIRS if any bottom dir UNCHECKED!
while (uncheckedDirsOnLevel(path, checkedDirs).size() > 0) {
while (getDirsInDir(path).size() == 0
|| (numberOfCheckedDirsOnLevel(path, checkedDirs)==getDirsInDir(path).size())) {
allDirs.add(new FileObject(new File(path)));
checkedDirs.add(new FileObject(new File(path)));
if(traverseDownOneLevel(path) == startingPath)
return allDirs;
//get nearer to the root
path = traverseDownOneLevel(path);
}
path = giveAnUncheckedDir(path, checkedDirs);
if (path == "NoUnchecked.") {
checkedDirs.add(new FileObject((new File(path)).getParentFile()));
break;
}
}
}
}
return allDirs;
}
Резюме о коде:
- Перейти так глубоко в дереве каталогов, как это возможно. Когда в режке нет директории, остановитесь, поставьте рекордер в комплект, перейдите. Не проверяйте dirs в комплекте.
- Остановите и верните комплект, если вы достигнете начального пути.
- Повторите шаги 1 и 2.
предпосылки: каталог-структура является конечной и с небольшим количеством данных.
ИМО лучше идти сверху вниз, а затем снизу вверх (как в моем решении ниже :)). Это более естественно, и вам не нужно сохранять пути на промежуточных уровнях. – pajton
Что вы пытаетесь сделать? Вы пытаетесь перечислить все подкаталоги, пока не достигнете определенного уровня? – OscarRyz
В названии говорится: «рекурсивно», но в вашем коде не рекурсивно? Вы ищете рекурсивное решение или для нерекурсивного решения? Полное имя для «FileObject» - это 'javax.tools.FileObject' – OscarRyz