2016-11-20 3 views
0

Ich möchte in meiner Klasse ein verschachteltes Hastable haben, um die Menge der Zutaten einzustellen. Bitte beachten Sie das folgende Szenario.JAVA verschachtelte Hashtables mit Enum

Szenario:

Ein Rezept hat mehrere Bestandteile:

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

} 

}

Hier in diesem Szenario i für das Innere Rezept, um die Menge der einzelnen Zutaten enthalten sein sollen glauben i-Hash-Tabelle ist der beste Ansatz. Aber wie kann ich eine Hash-Tabelle in einem anderen (so etwas wie diese):

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

wo Einheit eine Enum der Klasse Rezepts ist.

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

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

Er sagt, dass Hashtable (int,float) in Hashtable cannot be applied to (Recipe.uom,int)

Frage: unter Berücksichtigung dieses scenarion Einnahme. Wie kann ich eine Hashtabelle innerhalb einer anderen setzen, die eine Enumeration als Schlüssel verwendet?

+1

Warum brauchen Sie eine Hashtabelle, um die Einheit und die Menge der Zutaten zu speichern? das können einfache Eigenschaften in der Klasse ungredient sein ... –

+0

'HashTable' ist eine" alte "Klasse, und es wird jetzt empfohlen,' HashMap' stattdessen zu verwenden, wenn Sie die Synchronisation nicht benötigen. –

+0

@TimothyTruckle, ich möchte eine Liste der vorhandenen Zutaten meiner Rezepte dafür, dass ich doppelte Zutaten bekommen werde, da ich in einem Rezept 1 Zitrone und in einem anderen 3 Zitronen verwenden könnte. Ich denke, dass eine Zutat eine Ernährung wie Kcal, Lipide usw. haben könnte. Deshalb denke ich, dass die Menge der Zutaten von dem Rezept abhängt und deshalb denke ich, dass das eine Eigenschaft eines Rezepts sein könnte. – ePascoal

Antwort

0

Nun, ich nehme an, das eine faire Antwort ist und es funktioniert für mich ..

In der Tat, in diesem Fall haben wir eine dritte Klasse mit dem Namen Portion in Erwägung ziehen könnte, die eine skalierbare Ansatz ist, da es den Vorteil hat, hinzufügen Methoden oder mehr Attribute, wenn wir morgen einen "komplexen" Teil haben wollen, aber in meinem Fall scheint dieses Wörterbuch meinen Bedürfnissen zu entsprechen. Also sollte eine geschachtelte HashTable/HashMap wie folgt definiert werden:

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

Sie müssen auch die put() Methode tun andere Hashtable verwenden:

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

Ich werde HashMap statt HashTable in dieser Antwort verwenden, da die ehemaligen jetzt der Standard-Ansatz.

Sie haben die „verschachtelten“ HashMap separat zu konstruieren, die Put-Methode:

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

ich mit Timothy einverstanden, dass dies nicht wirklich ein gutes Design ist. Ich würde persönlich eine andere Klasse/Schnittstelle Amount schaffen, die dieses Zeug behandelt.