2012-10-03 49 views
1

我遇到了一些問題,我需要遍歷層次結構並比較一些值,並且我得到匹配的時刻需要返回結果。這裏是我完整的用例通過層次結構(Java)遞歸調用

我越來越Collection<Categories> categoryList和A Collection<MyCustomObject>, MyCustomObject {// 一些屬性 私人範疇類別 }

我需要類別的代碼類型的代碼比較來MyCustomObject下,需要返回MyCustomObject與第一次匹配。

爲了進行比較,我需要遍歷集合i.w的層次結構,如果在當前類別中找不到匹配項,則需要調用 categoryList.getSuperCategories()然後向上獲取類別列表。

雖然是遞歸方法調用,但似乎這不工作在我的情況下,就像我繼續遍歷第一個類別直到根,我不能跟蹤第二個。

我是想的東西(未完成,也沒有正常工作)

public ProductAllotmentData getProductAllotmnet(final Collection<CategoryModel> categoryModelList) 
{ 
    if (CollectionUtils.isNotEmpty(categoryModelList)) 
    { 
    final List<ProductAllotment> productAllotmentList = getProductAllotmentEntries(); 
    if (CollectionUtils.isNotEmpty(productAllotmentList)) 
    { 
    for (final CategoryModel model : categoryModelList) 
    { 
    for (final ProductAllotmentData productAllotmentData : productAllotmentList) 
    { 
     if (model.getCode().equals(productAllotmentData.getAllotmentCategory().getCode())) 
     { 
     return ProductAllotmentData; 

     } 
     else 
     { 
     return getAllotmentForCategory(model.getAllSupercategories(), productAllotmentyData); 
     } 
    } 
    } 
    } 
    } 

    return null; 
} 

-

public ProductAllotmentData getAllotmentForCategory(final Collection<CategoryModel> categoryModelList, 
     final ProductAllotmentData productAllotmentaData) 
    { 
     ProductAllotmentData allotmentData = null; 
     for (final CategoryModel model : categoryModelList) 
     { 
     if (model.getCode().equals(productAllotmentData.getAllotmentCategory().getCode())) 
     { 
     allotmentEntryData = productAllotmentData; 

     } 
     else 
     { 
     return getAllotmentForCategory(model.getSupercategories(), productAllotmentData); 
     } 
     } 

     return allotmentEntryData; 
    } 

其他選擇來到我的腦海裏是創造一種堆棧,並把在所有類別並一次只彈出一個比較他們,併發回第一場比賽忽略堆棧中的其他項目,但即時通訊尋找更好更靈活的解決方案。

問題

我不知道我怎麼可以遍歷每個類別的層次結構以比較其代碼。 getAllotmentForCategory是我想要遍歷我的類別層次結構的地方。

在這方面的任何幫助,真的很不錯

+4

有時候你會使用真正的長變量名稱DoesntImproveClarity我看不到你在遞歸的地方。你的問題是什麼? –

+1

@PeterLawrey這是一個偉大的! –

+0

'我在某個問題上遇到了問題' - 你到現在還沒有告訴你的問題.. –

回答

0

你需要,當你到達根遍歷回子類別。相反直接進入root並下去,直到找到遞歸方法。

像...(代碼沒有複製粘貼代碼)

public ProductAllotmentEntryData recursive(root, code) { 
if(root.code == code) 
    return root; 
}else{ 
    for(root.childs){ 
     object = recursive(child, code) 
     if(object!=null) 
      return object; 
    } 
return null; 
} 
0

做什麼,我覺得你描述...

public ProductAllotmentData getAllotmentForCategory(
     final Collection<CategoryModel> categoryModelList, 
     final ProductAllotmentData productAllotmentaData) { 
    for (final CategoryModel model : categoryModelList) { 
     if (model.getCode().equals(
       productAllotmentData.getAllotmentCategory().getCode())) { 
      return productAllotmentData; 
     } 
    } 
    for (final CategoryModel model : categoryModelList) { 
     if (model.getSupercategories() != null) { 
      return getAllotmentForCategory(
        model.getSupercategories(), productAllotmentData); 
     } 
    } 
    return null; // or throw an exception. 
} 

注意,這個假設的「類別」是分層的;即「類別」圖中沒有周期。它還假定您想要返回匹配的第一個「類別」的「分配」,而不考慮其他「類別」可以匹配的事實。


(問題是,你沒有描述足夠的細節問題,所以這是不可能找出「產品」,「類別」和「配股」的意思,因此什麼語義上的獲得'分配'的正確方法。)