我有一套配料。我需要在Java中检索包含这些成分的所有配方

时间:2016-02-11 09:19:11

标签: java arrays arraylist hashmap hashset

例如,我有一系列成分,我需要获得所有含有这些成分的食谱。我不知道要使用什么,HashMap,HashSet或ArrayList。任何人都可以展示一个小例子吗?

2 个答案:

答案 0 :(得分:1)

您可以使用HashMap,密钥为Ingredient,值为HashSet<Recipe>

所以你会:

HashMap<Ingredient , HashSet<Recipe>> map;

地图中的每个HashSet都包含具有相应关键成分

的所有食谱

现在,给定一组成分作为“键”,在地图中找到相应的HashSet,并将它们放在Set

结果是Set<HashSet<Recipe>>

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

答案 1 :(得分:0)

如果您需要查找包含任何一种给定成分的所有食谱,您基本上需要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是数据库中用于此类任务的数据结构。它将每个成分的存在表示为密钥中的一个位,并且在搜索匹配时能够对密钥执行位操作(即,它能够使用至少具有这些成分方式来搜索索引)