JAVA嵌套哈希表与枚举

时间:2016-11-20 16:57:44

标签: java hashtable enumeration

我想在我的课堂上有一个嵌套的hastable来设定成分的数量。请考虑以下情况。

场景:

一种食谱有几种成分:

public class Ingredient {

    private static int id;

    String name;



    public Ingredient(String name) {
        this.name = name;
    }
}

public class Recipe {

public static enum uom{
    ml,gr, unit, teaspoon, tablespoon,cup,coffeespoon
};

public String name;

public Hashtable<Ingredient,Hashtable<uom,Integer>> ingredients;
public String description;

public Recipe(String name, String description, Hashtable<Ingredient,Hashtable<uom,Integer>> ingredients) {

    this.name = name;
    this.description = description;
    this.ingredients = ingredients;
}


public static void main (String [] args) {
    Ingredient lemon = new Ingredient("lemon");

    Hashtable<Ingredient,Hashtable<Recipe.uom,Integer>> ingredient = null;

    ingredient.put(new Ingredient("Lemon"),new Hashtable(uom.unit,1));

    Recipe LemonPie = new Recipe("Lemon pie","blabla",ingredients);

}

}

在这种情况下,我希望在内部配方中包含每种成分的数量,我相信哈希表是最好的方法。但是如何在另一个内部设置一个哈希表(类似这样):

{new Ingredient("Lemon") :  {"unit":1}}

其中unit是Recipe类的枚举。

Hashtable<Ingredient,Hashtable<Recipe.uom,Integer>> ingredient = null;

ingredient.put(new Ingredient("Lemon"),new Hashtable(uom.unit,1));

它说Hashtable (int,float) in Hashtable cannot be applied to (Recipe.uom,int)

问题: 考虑到这种情况。如何在另一个内部设置哈希表作为枚举键?

3 个答案:

答案 0 :(得分:2)

我将在此答案中使用HashMap而不是HashTable,因为前者现在是标准方法。

您必须使用put方法单独构建“嵌套”HashMap

Map<Recipe.uom, Integer> amount = new HashMap<>();
amount.put(Recipe.uom.unit, 1);
Ingredient lemon = new Ingredient("Lemon", amount);

我同意蒂莫西的说法,这不是一个好的设计。我个人创建了另一个处理这些东西的类/接口Amount

答案 1 :(得分:1)

你需要在其他Hashtable上使用put()方法:

Map<Recipe.uom,Integer> mass new HashMap<>();
mass.put(uom.unit,1);
ingredient.put(new Ingredient("Lemon"),mass);

答案 2 :(得分:0)

嗯,我想这是一个公平的答案,对我有用..

事实上,在这种情况下,我们可以考虑一个名为Portion的第三个类,这是一种可扩展的方法,因为如果明天我们想要一个复杂的&#34;它可以添加方法或更多属性。部分,但在我的情况下,这本字典似乎符合我的需要。所以嵌套的HashTable / HashMap应该像这样定义:

    Ingredient lemon = new Ingredient("lemon");
    Ingredient powder = new Ingredient("powder");

    HashMap<Ingredient,HashMap<uom,Integer>> portion = new HashMap<Ingredient,HashMap<uom,Integer>>();

    portion.put(lemon,new HashMap<uom, Integer>(){{put(uom.unit,1);}});
    portion.put(powder,new HashMap<uom, Integer>(){{put(uom.cup,2);}});

    Recipe lemon_cake = new Recipe("lemon cake","bla bla",portion,"Mr Martin");