【问题标题】:Category/Subcategory: How to get all subcategories(their subcategories too) for given category?类别/子类别:如何获取给定类别的所有子类别(它们的子类别)?
【发布时间】:2023-03-17 23:53:02
【问题描述】:

有一个类Category,具有以下(重要)属性:

public class Category{
   private Integer id;
   private String name;
   private Category parentCategory;
   private Set<Category> subcategories = new HashSet<Category>();
   ...
   //getters and setters
}

我正在尝试实现类别/子类别的概念。一个类别可以有零个或多个子类别。一个类别只能有一个父类别(可以是null)。对于顶级类别parentCategory=null

现在,我有一个所有类别的列表,List&lt;Category&gt; allCategories = (retrieved from database)

如果我有某个类别(或categoryId)和allCategories,我如何获得给定类别的所有子类别(及其子类别)的列表?使用哪个循环? (可以限制为子类别深度级别 3)

【问题讨论】:

标签: java list loops for-loop while-loop


【解决方案1】:

这里有一些伪代码,如果您想要更具体的解决方案,请提供 ResultSet 详细信息。

for(all result set) {
    currentCategoriesFromDb = current category;
    currentCategoriesFromDb.setParentCategory() = parentCategoryId;
    parentCategory.addCategory(currentCategoriesFromDb )
}

如果所有类别层次结构都已初始化并且您想要导航,您可以执行以下操作:

currentCategory.getChildByName(name1).getChildByName(name2);

如果你想要递归地精确所有的东西:

printbCategories(Category category) {
    print(category);
    List<Category> subCategories = category.getSubCategories();
    for(Category category : subCategories ) {
        printbCategories(category);  
    }
}

【讨论】:

  • 我认为这段代码不能满足他的要求。
  • 这是一个算法,如果从数据库中提取后没有初始化父/子类别,如何初始化它们。
  • 没有直接关系,但这是compute 'Tests by Category' counter的一种方式。
【解决方案2】:

可以使用查询在数据库级别上获取类别树。如果您的 Category 类是 JPA Entity,您可以使用如下查询:

SELECT c1
FROM Category c1 JOIN c1.subcategories c2 JOIN c2.subcategories c3
WHERE c1.id = :categoryId

这将获取具有给定 categoryId 根的类别树。现在,如果你想创建一个树的平面结构(列表或集合),你可以使用 DFS 或 BFS 算法http://en.wikipedia.org/wiki/Tree_traversal

【讨论】:

  • 我想在一个函数/方法中实现它(如果可能的话)。因为解释我如何从数据库中获取它非常复杂。因此,我将问题简化为使用带有属性和方法的简单类。
  • 那么就可以简单的遍历所有元素找到一个根节点,然后使用DFS或者BFS查找根节点的所有子节点。
猜你喜欢
  • 2015-09-18
  • 2012-12-26
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2014-07-09
相关资源
最近更新 更多