我有两个类别的食谱和成分(带有:成分名称,数量,单位)和两种连接这两个类别的方法。
考虑到我将需要在应用程序中找出哪些食谱对象包含特定成分的事实,这是最佳的性能实践。
非常感谢您!
答案 0 :(得分:0)
要允许Recipe
分别引用一种成分类型和该成分的数量,我建议创建一个Ingredient
类和一个IngredientQuantity
类。
Ingredient
类表示一种成分,但不知道数量。作为一个简单的起点,Ingredient
类可能只包含保存成分名称的String
,但是您可以添加其他字段来表示有关此成分类型的其他有用数据。稍后,我们需要在Ingredient
中使用此Map
类作为键,因此请确保在equals()
中覆盖hashCode()
和Ingredient
方法类,否则它将无法用作键。
IngredientQuantity
类代表特定数量的特定成分,其轮廓可能如下所示:
public final class IngredientQuantity {
public static enum QuantityUnit {
// Add other unit types here.
PIECE, MILLILITRE, GRAMME
}
private final Ingredient ingredient;
private final QuantityUnit unit;
private final double quantity;
public IngredientQuantity(Ingredient ingredient, QuantityUnit unit,
double quantity) {
this.ingredient = Objects.requireNonNull(ingredient);
this.unit = Objects.requireNonNull(unit);
this.quantity = quantity;
if (quantity < 0) {
throw new IllegalArgumentException("Quantity cannot be negative.");
}
}
}
(这已简化,因此您必须添加getter方法和其他必需的功能。)
现在您的Recipe
类可以包含一个Collection<IngredientQuantity>
,它描述了食谱所需的每种成分的数量。如果您对每个成分类型只允许一次感到偏执,那么可以使用Map<Ingredient, IngredientQuantity>
来检测重复项。但是,如果您可以控制食谱对象的构建,那么无论如何应该避免重复。
无论哪种方式,您现在都可以从Recipe
到所需的Ingredient
对象的集合中。
要从Ingredient
到Recipe
,您需要建立一个Map<Ingredient, Set<Recipe>>
,它将每个Ingredient
对象映射到所有需要Recipe
的对象该成分类型。在将配方读入应用程序时,您需要填充此内容,迭代每个配方的成分,然后在地图中的Recipe
键下将Ingredient
添加到地图中。
如果您的应用程序包含大量配方,因此在应用程序启动时无法读取所有配方,则必须将映射数据与配方数据一起存储,例如数据库或数据文件结构本身。但这是一个非常不同的问题。