2016-11-20 2 views
0

Я хотел бы иметь в своем классе вложенный hastable, чтобы установить количество ингредиентов. Пожалуйста, рассмотрите следующий сценарий.JAVA вложенные hashtables с enum

Сценарий:

Один рецепт имеет несколько ингредиентов:

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 в рассмотрении. Как я могу установить хеш-таблицу внутри другого, взяв в качестве ключа перечисление?

+1

Почему вам нужна хэш-таблица для хранения единицы и патронов ингредиента? которые могут быть простыми свойствами в классе ungredient ... –

+0

'HashTable' - это« старый »класс, и теперь рекомендуется использовать' HashMap' вместо этого, конечно, если вам не нужна синхронизация. –

+0

@TimothyTruckle, я бы хотел, чтобы список существующих ингредиентов моих рецептов для меня получал повторяющиеся ингредиенты, так как в одном рецепте я мог использовать 1 лимон, а в другом - 3 лимона. Я думаю, что ингредиент может иметь такое питание, как ккал, липиды и т. Д. Вот почему я думаю, что количество ингредиентов зависит от рецепта, и поэтому я считаю, что это может быть свойство рецепта. – ePascoal

ответ

0

Ну я полагаю, что это честный ответ, и это работает для меня ..

В самом деле, в этом случае мы могли бы рассмотреть третий класс с именем Порция, который является масштабируемым подходом, поскольку он имеет преимущество, чтобы добавить методы или больше атрибутов, если завтра мы захотим «сложную» часть, но в моем случае этот словарь, похоже, соответствует моим потребностям. Таким образом, вложенный 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"); 
1

вам нужно использовать метод put() на тат другой Hashtable тоже:

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

Я собираюсь использовать HashMap вместо HashTable в этом ответе, как бывший теперь стандартный подход.

Вы должны построить «вложенную» HashMap отдельно, используя метод пут:

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

Я согласен с Тимофеем, что это на самом деле не очень хороший дизайн. Я лично создал еще один класс/интерфейс Amount, который обрабатывает этот материал.