簡體   English   中英

Java遞歸方法ArrayList不會將所有子元素添加到最終ArrayList中

[英]Java Recursive Method ArrayList is not adding all child elements to the final ArrayList

我正在編寫一個遍歷Java對象層次結構的遞歸方法。 為此,我編寫了一個遞歸方法,該方法將根節點(父)作為參數。 這是調用遞歸方法遍歷的基本方法:

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 ....[]

但我想將所有這些單獨的子對象放入一個ArrayList中,並返回到我的第一個方法。 請幫我解決這個問題。 提前致謝。

原因是您的遞歸是獲取數組的副本,並且不向原始父數組返回任何內容[按值傳遞]。

嘗試將類別列表移到函數外,並使其成為全局/靜態變量。

您可以傳遞單個(!)列表以在遞歸方法中將所有對象作為參數接收:

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

子類別包含層次結構中所有節點的所有對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM