例如,我有一系列成分,我需要获得所有含有这些成分的食谱。我不知道要使用什么,HashMap,HashSet或ArrayList。任何人都可以展示一个小例子吗?
答案 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等)中的多图实现。
如果您需要查找包含所有给定成分的配方,那么这种数据结构会更复杂一些,解决方案将取决于您希望在性能和空间复杂性之间进行权衡:
您可以为每个食谱创建所有可能的成分子集,并将每个子集的食谱参考存储在Map<Set<Ingredient>, Set<Recipe>>
中。这将有不断的查找时间,但地图将相对较大
您可以使用Map<Ingredient, Set<Recipe>>
方法,但不会返回搜索每种成分的所有结果,而只返回所有每种成分搜索结果中存在的结果
Bitmask index是数据库中用于此类任务的数据结构。它将每个成分的存在表示为密钥中的一个位,并且在搜索匹配时能够对密钥执行位操作(即,它能够使用至少具有这些成分方式来搜索索引)