Java递归方法ArrayList并没有将所有的子元素添加到最终的ArrayList中



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

if (category.id == GALLERIE_ID_TEST) {
                traverse(category);
                System.out.println("children ...." + subCategories);
            }
在遍历方法中,我写了一个遍历父节点的所有子节点的逻辑。但是当我将所有的子对象添加到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 ....[]

但是我想把所有这些单独的子对象放到一个数组列表中然后返回到我的第一个方法。请帮我解决这个问题。

原因是你的递归是得到你的数组的副本,并没有返回到原始的父数组[传递值]。

试着把你的分类列表移到函数之外,使它成为一个全局/静态变量。

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

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

和子类别包含层次结构中所有节点的所有对象。

最新更新