1

階層をトラバースしていくつかの値を比較する必要があり、一致した瞬間に結果を返す必要があるという問題で立ち往生しています。これが私の完全なユースケースです

私は取得Collection<Categories> categoryListしています、A Collection<MyCustomObject>、MyCustomObject{//いくつかのプロパティプライベートカテゴリカテゴリ}

カテゴリのコードをMyCustomObjectの下にあるカテゴリのコードと比較し、最初に一致したMyCustomObjectを返送する必要があります。

この比較では、コレクションiwの階層をトラバースする必要があります。現在のカテゴリに一致するものが見つからない場合は、を呼び出してカテゴリリストを取得してから、 categoryList.getSuperCategories()上に移動する必要があります。

私は再帰的なメソッド呼び出しを考えていますが、私の場合、ルートまで最初のカテゴリをトラバースし続けているかのように、これは機能していないようです。2番目のカテゴリを追跡できません。

私は何かを試していました(完了していないか、正しく機能していません)

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

他のオプションは、ある種のスタックを作成し、その中にすべてのカテゴリを配置し、一度に1つずつポップして比較し、スタック内の残りのアイテムを無視して最初の一致を送り返すことですが、はるかに優れたものを探しています。柔軟なソリューション。

問題

各カテゴリの階層をトラバースしてコードを比較する方法がわかりません。 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 に答える