java - 重构 - 简化 java 中的嵌套 for 循环

标签 java for-loop recursion refactoring

我需要弄清楚如何改进以下代码:

      for (DirCategory c1 : categories1) {
            c1.setCount(dirEntryService.getDirEntryCategoryCount(c1));
            log.debug("c1: "+c1.getCount()+" - "+c1.getName());
            dirCategoryService.persist(c1);

            List<DirCategory> categories2 = c1.getChildren();
            for (DirCategory c2 : categories2) {
                c2.setCount(dirEntryService.getDirEntryCategoryCount(c2));
                log.debug("  c2: "+c2.getCount()+" - "+c2.getName());
                dirCategoryService.persist(c2);

                List<DirCategory> categories3 = c2.getChildren();
                for (DirCategory c3 : categories3) {
                    c3.setCount(dirEntryService.getDirEntryCategoryCount(c3));
                    log.debug("    c3: "+c3.getCount()+" - "+c3.getName());
                    dirCategoryService.persist(c3);

                    List<DirCategory> categories4 = c3.getChildren();
                    for (DirCategory c4 : categories4) {
                        c4.setCount(dirEntryService.getDirEntryCategoryCount(c4));
                        log.debug("      c4: "+c4.getCount()+" - "+c4.getName());
                        dirCategoryService.persist(c4);

                        List<DirCategory> categories5 = c4.getChildren();
                        for (DirCategory c5 : categories5) {
                            c5.setCount(dirEntryService.getDirEntryCategoryCount(c5));
                            log.debug("        c5: "+c5.getCount()+" - "+c5.getName());
                            dirCategoryService.persist(c5);

                            List<DirCategory> categories6 = c5.getChildren();
                            for (DirCategory c6 : categories6) {
                                 c6.setCount(dirEntryService.getDirEntryCategoryCount(c6));
                                log.debug("          c6: "+c6.getCount()+" - "+c6.getName());
                                 dirCategoryService.persist(c6);
                            }
                        }
                    }
                }
            }
        }

我真的很感激任何帮助简化这个“东西”

最佳答案

这对于递归来说看起来很不错,因为所有循环都具有完全相同的结构和内容。递归的思想是将所有循环嵌套到某个深度d,递归结构为

  • 嵌套到零深度是空操作,并且
  • 嵌套到深度 d + 1 对深度 d 的所有循环执行 for 循环。

这可以写成

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 进行探索。

当然,这种方法适用于深度最多为 5 的假设。如果你想消除深度要求并一直探索到目录底部,那么你可以像这样消除深度参数:

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);
    }
}

更一般地说,任何时候您想要在彼此内部嵌套任意数量的循环时,都可以考虑将递归作为一种选择。它是表达此概念的非常通用的框架。

希望这对您有所帮助!

关于java - 重构 - 简化 java 中的嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5398747/

相关文章:

java - 如何在 eclipse 中调试 groovy 代码 (Play-Framework)

java - 如果方法返回接口(interface),则返回什么?

java - Android ViewPager 控件未出现在图形布局编辑器中

java - 如何在此数组代码上进行 for 循环?

javascript - 如何解决递归异步 promise ?

list - F# 递归函数 : make list items unique

类中的 Java MouseListener

linux - For i in 循环并出现 printf 错误

c - 在C中为大程序分配内存

c - 如何避免在这个递归函数中使用malloc?