Это похоже на отличную работу для рекурсии, поскольку все циклы имеют одинаковую структуру и содержание.Рекурсивная идея состоит в том, чтобы вложить все циклы на некоторую глубину d, при этом рекурсивная структура имеет вид
- Вложение в нулевую глубину не допускается, а
- Вложение в глубину d +1 выполняет цикл for для всех циклов глубины d.
Это можно записать как
private static void recursiveExplore(List<DirCategory> categories, int depth) {
if (depth == 0) return;
for (DirCategory c1 : categories) {
c1.setCount(dirEntryService.getDirEntryCategoryCount(c1));
log.debug("c1: "+c1.getCount()+" - "+c1.getName());
dirCategoryService.persist(c1);
recursiveExplore(c1.getChildren(), depth - 1);
}
}
public static void explore(List<DirCategory> categories) {
recursiveExplore(categories, 5);
}
Затем вы можете выполнить исследование, позвонив по номеру explore
.
Конечно, этот подход работает с предположением, что глубина составляет не более пяти.Если вы хотите исключить требование глубины и просто изучить весь путь до самого конца каталога, то вы можете просто исключить параметр глубины, например, такой:
public static void explore(List<DirCategory> categories) {
for (DirCategory c1 : categories) {
c1.setCount(dirEntryService.getDirEntryCategoryCount(c1));
log.debug("c1: "+c1.getCount()+" - "+c1.getName());
dirCategoryService.persist(c1);
recursiveExplore(c1.getChildren(), depth - 1);
}
}
В более широком смысле, в любое время, когда вы захотитевложите произвольное число циклов друг в друга, рассмотрите рекурсию как вариант.Это очень общая структура для выражения этой концепции.
Надеюсь, это поможет!