2016-11-20 12 views
0

私のクラスでは、成分の量を設定するネストされたhastableがあります。以下のシナリオを考えてみてください。enumのJavaネストされたハッシュテーブル

シナリオ:

一つのレシピは、いくつかの成分を持っている:

私は内部のレシピ私は、ハッシュテーブルがあると信じているため、各成分の量を含めるここでは、このシナリオでは
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}} 

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)

質問と言う: は考慮してこのscenarionを取ります。どのように私はハッシュテーブルを別のキーをenumとして取るかを設定できますか?

+1

?これは、無作為なクラスの単純なプロパティである可能性があります... –

+0

'HashTable'は「古い」クラスで、同期を必要としない場合は、代わりに' HashMap'を使用することをお勧めします。 –

+0

@TimothyTruckle、私はレシピの既存の成分のリストを希望します。それは、1つのレシピでは1つのレモンを使用することができ、別のレシピでは3つのレモンを持つことができるので、私は成分がkcal、脂質などのような栄養を持つことができると思うのですが、なぜ私は成分の量がレシピに依存していると思うのですか?それはレシピの特性かもしれません。 – ePascoal

答えて

0

まあ、それは追加する利点を持っているので

は、実際には、このケースでは、我々はスケーラブルなアプローチされている部分という名前の第三のクラスを、検討することもでき..私は、これは公正な答えであると仮定し、それが私の作品メソッドまたはそれ以上の属性を明示的に使用する必要があります。私の場合、この辞書は私のニーズに合っているようです。だから、ネストされたハッシュテーブル/ HashMapのは、次のように定義する必要があります:あなたはユニットや成分のammoutを格納するハッシュテーブルを必要としない理由

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"); 
1

あなたもTAT他のHashtableにput()メソッドを使用する必要があります。

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

私は前者が今標準的なアプローチであるとして、この答えにHashMap代わりのHashTableを使用するつもりです。

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

私はこれは本当に良いデザインではないことをテモテに同意します:

あなたはputメソッドを使用して、個別に「入れ子になった」HashMapを構築する必要があります。私は個人的に別のクラス/インターフェースAmountを作成して、このようなことを処理します。

関連する問題