【问题标题】:Best data structure to represent food objects, and quantity [closed]表示食物对象和数量的最佳数据结构
【发布时间】:2021-11-30 11:56:05
【问题描述】:

我在 Java 中有一个问题,我有一个 RecipeBook,其中包含 Recipes,每个都由 Food 组成,并且相应的金额

食谱示例:“柠檬派食谱”:

  • 柠檬,2个
  • 面粉,6
  • 糖,5
  • 鸡蛋,2 个

问题是食物量可能因食谱而异,例如,在柠檬派食谱中,柠檬有 2 个单位,但在鳄梨酱食谱中,柠檬有 3 个单位。

所以我的问题是,将食物和食物量一起表示的最佳数据结构是什么?我创建了一个 Recipe 类,它有一个 ArrayList<ArrayList> foods 属性,我在其中保存 Food 对象和数量。就像在示例中一样:, , , > 但我不知道这是否是实现食谱列表的最佳方式。

【问题讨论】:

    标签: java arrays hashmap structure


    【解决方案1】:

    应该实现一个单独的类Recipe,包括收据名称、成分集合、应该如何处理成分的一组说明。

    收据中的配料应包含有关食物、数量和数量计量单位(件、克/盎司、汤匙/茶匙等)的信息。为简单起见,食物可以表示为 String 值,也可以表示为具有更多详细信息(例如类别、价格、准备、可能的替代品等)的类/枚举

    public class Ingredient {
        String food;
        Number amount;
        Unit unit;
    
    // constructor(s), getters/setters
    }
    
    enum Unit {
        PIECE,
        GRAM,
        MILLILITER,
        TABLESPOON,
        TEASPOON;
    }
    

    每个配方的成分收集的最佳实施方式实际上是一个基于意见的问题。它可以作为地图完成:

    public class Recipe {
        String name;
        Map<String, Ingredient> ingredientsByNames;
        String instructions;
    // constructor(s), getters/setters
    }
    

    或列表/集合:

    public class Recipe {
        String name;
        List<Ingredient> ingredients;
        String instructions;
    // constructor(s), getters/setters
    }
    

    【讨论】:

    • 这也是我的解决方案。 Map 不能表示“1.5 个装满的勺子”或类似“300 ml”的东西,所以你肯定需要一个单位,这就是为什么 Integer 绝对不是最佳选择的原因。您可以使用 Map 或类似的东西。 重要的一点:HashMap 的键必须以正确的方式实现hashCodeequal 方法。请参阅文档。
    【解决方案2】:

    在你的类 ReceipeBook 中定义一个名为 receipe 的 HashMap

    Map<String, Integer> receipe = new HashMap<>();
    

    因此,它没有固定大小,您可以使用以下方法在地图中添加任意数量的项目:

    receipe.put("Lemon",2);
    

    等等……

    【讨论】:

      【解决方案3】:

      HashMap:配方

      Map<String, Integer> recipe = new HashMap<>();
      

      如果单位也可以是十进制,请更改为Map&lt;String, Double&gt;

      这没有固定大小,可以动态扩展。

      其他选项是创建 2 个数组列表。一个用于食物名称,另一个用于单位。如果您想按索引遍历例如用例,这将很有用:

      a) 从第一个开始购买 10 件食品(a:5、b:2、c:3)。

      b) 你有 1000 美元,买最多的东西,保持列表中从 1 到 n 的优先级。

      【讨论】:

        猜你喜欢
        • 2017-09-26
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多