【问题标题】:Java Recursive Method ArrayList is not adding all child elements to the final ArrayListJava递归方法ArrayList没有将所有子元素添加到最终的ArrayList
【发布时间】:2015-08-19 02:55:18
【问题描述】:

我正在编写一个遍历 Java 对象层次结构的递归方法。为此,我编写了一个以根节点(父节点)为参数的递归方法。这是调用递归方法遍历的基本方法:

if (category.id == GALLERIE_ID_TEST) {
                traverse(category);
                System.out.println("children ...." + subCategories);
            }

在 traverse 方法中,我编写了一个遍历父节点的所有子节点的逻辑。但是当我将所有子对象添加到 ArrayList 时,所有子对象都不会从此方法添加到最终列表中。它仅返回父节点的子节点数,但我也需要获取后续节点的所有子节点。

我的代码如下:

private static void traverse(KalturaCategory category)
        throws KalturaApiException {
    List<KalturaCategory> subCategories = new ArrayList<KalturaCategory>();
    KalturaCategoryListResponse categoriesList = null;
    if (category != null && category.directSubCategoriesCount >= 1) {
        KalturaCategoryFilter filter = new KalturaCategoryFilter();
        filter.parentIdEqual = category.id;
        categoriesList = getCategoriesList(filter);
        if (categoriesList.totalCount != 0) {
            for (KalturaCategory subCat : categoriesList.objects) {
                traverse(subCat);
                subCategories.add(subCat);
            }
        }
        System.out.println("subCategories Size ------>"
                + subCategories.size());

    }

}

我的输出是:

subCategories Size ------>3
subCategories Size ------>4
subCategories Size ------>5
subCategories Size ------>5
subCategories Size ------>1
subCategories Size ------>6
children ....[]

但我想将所有这些单独的子对象放入一个 ArrayList 并返回到我的第一个方法。请帮我解决这个问题。提前致谢。

【问题讨论】:

  • 您确定 getCategoriesList() 行为正常吗?
  • 感谢您的回复。是的,它是一个始终返回结果的标准结构。我也打印了这种方法的值。它的返回: categoriesList.totalCount ------>6 categoriesList.totalCount ------>3 subCategories Size ------>3 categoriesList.totalCount ------>4 subCategories Size -- ---->4 categoriesList.totalCount ------>5 subCategories Size ------>5 categoriesList.totalCount ------>5 subCategories Size ------>5 categoriesList. totalCount ------>1 个子类别大小 ------>1 个子类别大小 ------>6
  • 尝试交换这两个语句,traverse(subCat);subCategories.add(subCat);
  • 我尝试了很多解决方案,它也包括这个......交换这两个语句。无论如何它现在工作。我已将列表声明为解决问题的全局静态变量。感谢您花时间提供解决方案。
  • 如果你有它的工作并且你在这里使用了一个答案,你应该将它标记为接受。

标签: java recursion arraylist


【解决方案1】:

原因是您的递归是获取数组的副本,并且没有返回原始父数组[按值传递]。

尝试将您的类别列表移到函数之外并使其成为全局/静态变量。

【讨论】:

  • 非常感谢。这个解决方案奏效了。现在父母将所有孩子作为一个列表返回。
【解决方案2】:

您可以传递单个 (!) 列表来接收所有对象作为递归方法中的参数:

private static void traverse(KalturaCategory category,
                             List<KalturaCategory> subCategories ) 
    throws KalturaApiException {
    if (category != null && category.directSubCategoriesCount >= 1) {
        KalturaCategoryFilter filter = new KalturaCategoryFilter();
        filter.parentIdEqual = category.id;
        KalturaCategoryListResponse categoriesList =
            getCategoriesList(filter);
        if( categoriesList.totalCount != 0) {
            for (KalturaCategory subCat : categoriesList.objects) {
                traverse(subCat, subCategories);
            }
            subCategories.addAll( categoriesList.objects );
        }
    }
}

相应地更改第一个调用,使用根节点:

List<KalturaCategory> subCategories = new ArrayList<KalturaCategory>();
traverse( category, subCategories );

subCateogories 包含层次结构中所有节点的所有对象。

【讨论】:

  • 你能再具体一点吗?您没有为完整的可验证示例发布足够的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2021-03-19
相关资源
最近更新 更多