【问题标题】:I have a set of ingredients. And I need to retrieve all the recipes that contain those ingredients in Java [closed]我有一套配料。我需要在 Java 中检索所有包含这些成分的食谱 ​​[关闭]
【发布时间】:2016-05-21 23:34:12
【问题描述】:

例如,我有一系列成分,我需要获取包含这些成分的所有食谱。我不确定要使用什么,HashMap、HashSet 或 ArrayList。谁能举个小例子?

【问题讨论】:

  • 你如何代表食谱和成分?您的问题的答案完全取决于现有的数据模型。
  • 我刚刚启动程序,不知道如何做得更好。这个想法是拥有一系列成分,用户将输入这些成分以获取包含这些成分的所有食谱。而且我认为使用数组并不是很好,会有很多嵌套循环会使程序变慢。所以,我的问题是在这种情况下如何使用 HashMap 和 HashSet。

标签: java arrays arraylist hashmap hashset


【解决方案1】:

如果您需要查找包含任一给定成分的所有食谱,您基本上需要multimap 将每种成分映射到包含它的所有食谱集。

然后,您返回至少出现在其中一次搜索中的结果。

由于 Java 没有内置这样的数据结构,您可以使用 Map<Ingredient, Set<Recipe>> 或使用来自某些第三方库(Apache Commons、Google Guava 等)的多映射实现。


如果您需要找到包含所有给定成分的食谱,那么使用这种数据结构会稍微复杂一些,并且解决方案将取决于您想要在性能和空间复杂度之间做出何种权衡:

1) Multimap - 快速、高内存消耗

您可以为每个配方创建所有可能的成分子集,并将每个子集的配方参考存储在 Map<Set<Ingredient>, Set<Recipe>> 中。这将有恒定的查找时间,但地图会比较大

2) Multimap - 速度慢,内存消耗低

您可以使用Map<Ingredient, Set<Recipe>> 方法,但不是返回每种成分的所有搜索结果,而是仅返回所有成分搜索结果中存在的结果

3) 使用位掩码索引

Bitmask index 是数据库中用于此类任务的数据结构。它将每种成分的存在表示为键中的一个位,并且能够在搜索匹配项时对键执行位操作(即,它能够使用 至少具有这些成分 方式搜索索引) .

【讨论】:

  • 可能是地图>
  • @MGoksu 确实,谢谢。
【解决方案2】:

您可以使用 HashMap,键是 Ingredient,值是 HashSet<Recipe>

所以你将拥有:

HashMap<Ingredient , HashSet<Recipe>> map;

map 中的每个 HashSet 都包含所有具有相应 key 成分的 Recipes

现在,给定一组作为“键”的成分,在映射中找到它们对应的 HashSet 并将它们放在一个集合中

结果是Set&lt;HashSet&lt;Recipe&gt;&gt;

现在,为了阐明重复项,迭代 Set 中每个 HashSet 中的每个 Recipes,并将 Recipes 添加到另一个 HashSet 中,这是最终结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2021-04-16
    相关资源
    最近更新 更多