1

我遇到了一些问题,我需要遍历层次结构并比较一些值,而我得到匹配的那一刻需要返回结果。这是我的完整用例

我得到Collection<Categories> categoryList和 A Collection<MyCustomObject>, MyCustomObject{ // 一些属性 private Category category }

我需要将类别代码与 MyCustomObject 下的类别代码进行比较,并且需要将 MyCustomObject 与第一个匹配项发回。

对于这个比较我需要遍历 Collection iw 的层次结构如果在当前类别中没有找到匹配需要通过调用获取类别列表 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

2 回答 2

0

当您到达根目录时,您需要遍历回子类别。而是直接进入根目录并继续下去,直到你用递归方法找到它们。

喜欢...(代码不是复制粘贴代码)

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;
 }
于 2012-10-03T09:33:12.050 回答
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.
}

请注意,这假设“类别”是分层的;即“类别”图中没有循环。它还假设您想要返回匹配的第一个“类别”的“分配”……而不管其他“类别”也可以匹配。


(问题是您没有足够详细地描述问题。因此无法弄清楚“产品”、“类别”和“分配”的含义,因此在语义上正确的方法是什么?分配”。)

于 2012-10-03T09:58:23.320 回答