2015-12-09 3 views
0

Я делаю виртуальный зоопарк. Мой зоопарк имеет продовольственный магазин, который содержит ряд продуктов и количество каждого вида пищи. Вот мой Foodstore класс:Как перенести элементы из одной карты хэша в другую?

public class Foodstore { 

Map<String, Integer> register = new HashMap<String, Integer>(); //hashmap called register declaration 

public void addFood(String food, int quantity) { 
    if (register.containsKey(food)) {  //if register contains this food 
     Integer newAmount = register.get(food) + quantity; //assign new amount to newAmount 
     register.put(food, newAmount); //add this amount of the type of food 
    } 
    else { 
     register.put(food, quantity); 
    } 

} 

public void takeFood(String food) { 
    if (register.containsKey(food)) { //if register contains this food 
     Integer newAmount = register.get(food); //assign new amount to newAmount 
     register.remove(food, newAmount); //remove this amount of food 
    } 
    else { 
     register.remove(food); 
    } 
} 

}

У меня есть класс шкафа, который содержит свой собственный продуктовый магазин, вот как я создал корпус продовольственный магазин HashMap

Foodstore store = new Foodstore(); 

В моей зоопарк У меня есть zookeepers, у которых есть метод aMonthPasses, который должен позволить им перемещать до 20 предметов из магазина зоопарка в продовольственный магазин. Мне было интересно, как я это сделаю? Спасибо

+1

На 'java.util.HashMap' не существует метод' удалить (, ) '. – hotzst

ответ

0

Ваш метод takeFood немного перепутался.

Я считаю, что вы хотите передать quantity вашему методу takeFood, так же, как и с вашим методом addFood.

С помощью вашего текущего кода вы проверяете, содержит ли ваша карта food ключ. Если это не так, вы пытаетесь удалить элемент с этим ключом, который ничего не сделает, потому что ваша карта не содержит этот ключ. Если ваша карта содержит ключ food, вы получаете значение для этого ключа, а затем вызываете функцию remove на карте хэша с двумя параметрами. Однако функция remove функции хэш-карты не принимает двух параметров. Этот код даже не компилируется. Метод remove просто выведет элемент из карты с помощью ключа, который вы передадите ему.

Что вы хотите сделать, это получить текущее значение с карты, тогда если quantity, который вы передадите в свой метод takeFood, больше, чем текущее значение, выкиньте какое-то исключение или верните какое-то сообщение. Если запрошенный quantity меньше, чем текущая сумма в вашем продовольственном магазине, уменьшите текущее значение на quantity, а затем верните эту новую сумму на свою карту для ключа food. Кроме того, если ваш ключ food не существует на вашей карте хэша, вместо того, чтобы пытаться сделать remove ключ, который не существует на вашей карте хэша, вам нужно будет выбросить другое исключение или вернуть какое-то сообщение, указывающее, что нет ничего такого тип food в вашем Foodstore.

Вот что это будет выглядеть следующим образом:

public void takeFood(String food, int quantity) { 
    if (register.containsKey(food)) { //if register contains this food 
     Integer oldAmount = register.get(food); //get old amount from register 
     if (quantity > oldAmount) { 
      throw new Exception("Not enough " + food + " in foodstore. There is only " + oldAmount + " " + food + "."); //there is not that much in the foodstore - throw an error 
     } else {     
      Integer newAmount = oldAmount - quantity; //decrement the quantity from the old amount 
      register.put(food, newAmount); //set the value in the hash map to new amount 
     } 
    } 
    else { 
     throw new Exception("There is no " + food + " in the foodstore."); 
    } 
} 

Тогда в вашем Zookeeper классе, я предполагаю, что у вас есть ссылка на ваш зоопарк Foodstore, а затем Enclosure. Тогда в вашем классе Enclosure, это продовольственный магазин должен быть доступен из общедоступного метода.

public class Enclosure { 
    private Foodstore foodstore = new Foodstore(); 

    public Foodstore getFoodstore { 
     return foodstore; 
    } 
} 

Затем в Zookeeper классе, вы могли бы переместить еду вокруг, как это:

public class Zookeeper { 
    private Foodstore zooFoodstore; 
    private Enclosure enclosure; 

    //constructor to pass in references to the zoo's foodstore and the enclosure 
    public Zookeeper(Foodstore zooFoodstore, Enclosure enclosure) { 
     this.zooFoodstore = zooFoodstore; 
     this.lionEnclosure = lionEnclosure; 
    } 

    public void aMonthPasses() { 
     int quantity = 20; //get the amount of food you want to transfer here 
     String food = "meat"; //get the type of food you want to transfer here 
     try { 
      zooFoodstore.takeFood(food, quantity); 
      lionEnclosure.getFoodstore().addFood(food, quantity); 
     } catch (Exception ex) { 
      //food didn't exist in zoo foodstore or there wasn't enough 
     } 
    } 
} 
Смежные вопросы