Java场景下食谱中表示食物对象及对应数量的最优数据结构选型
Java食谱食材与用量存储最优方案推荐
原有方案存在的问题
你目前使用的ArrayList<ArrayList>存在以下明显缺陷:
- 类型不安全:未指定泛型类型,存取元素时需要强制类型转换,极易触发
ClassCastException运行时异常 - 查询效率低下:要获取某一食材的用量需要遍历整个列表,时间复杂度为O(n)
- 没有重复校验:无法避免同一种食材被重复添加到列表中,不符合单个食谱内同一种食材仅对应一个用量的业务逻辑
最优方案选型
根据你的业务需求,分两种场景选择对应方案:
场景1:仅需存储食材与用量两个属性
优先使用Map<Food, Integer>(若用量存在小数可替换为BigDecimal避免精度丢失)作为存储结构,优势如下:
- 天然匹配键值对关系:
Food对象作为key,用量作为value,语义清晰 - 查询效率高:基于
HashMap实现时,查询指定食材用量的时间复杂度为O(1) - 自动去重:Map结构天然保证key唯一,可避免同一种食材重复存储
- 遍历便捷:可通过
entrySet()、keySet()、values()方法灵活遍历所有食材、用量或键值对
注意:使用该方案需要为
Food类重写equals()和hashCode()方法,保证Map可以正确识别两个Food实例是否为同一种食材。
场景2:后续需要扩展食材附加属性
如果后续需要新增用量单位(个、克、毫升等)、预处理要求(榨汁、过筛等)等属性,推荐自定义Ingredient(用料)类,再用List<Ingredient>存储:
public class Ingredient { // 食材对象 private Food food; // 用量,用BigDecimal避免浮点精度问题 private BigDecimal quantity; // 用量单位 private String unit; // 预处理说明 private String prepNote; // 省略构造方法、getter、setter }
该方案扩展性极强,后续新增和食材在食谱中的关联属性时,不需要修改上层存储结构。
内容的提问来源于stack exchange,提问作者locolope
相关产品推荐
相关产品推荐

