#java
Вопрос:
Я пытаюсь рассчитать цену заказа, определяемую стоимостью блюд, типом блюд и типом гостя.
Класс Блюд:
public class DishImplementation implements Dish {
private String name;
private double basePrice;
private DishType type;
public DishImplementation(String name, double basePrice, DishType type) {
this.name = name;
this.basePrice = basePrice;
this.type = type;
}
@Override
public String getName() {
return name;
}
@Override
public double getBasePrice() {
return basePrice;
}
@Override
public DishType getDishType() {
return type;
}
Гостевой класс:
public class GuestImplementation implements Guest {
private String name;
private GuestType type;
public GuestImplementation (String name, GuestType type) {
this.type = type;
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public GuestType getGuestType() {
return type;
}
И вот класс, с которым у меня возникли проблемы, класс Order:
public class OrderImplementation implements Order {
private Guest guest;
private List<Dish> dishes;
public OrderImplementation(Guest guest, List<Dish> dishes) {
this.guest = guest;
this.dishes = dishes;
}
@Override
public double calculatePrice() {
double price = 0;
int i = 0;
double total = 0;
if ((getDishes().equals(DishType.MAIN_DISH)) || (getDishes().contains(DishType.DESSERT)) || (getDishes().contains(DishType.STARTER))) {
for (Dish a : dishes) {
Dish dish = dishes.get(i);
price = dish.getBasePrice();
total = total price;
i ;
}
return total = (total * this.guest.getGuestType().getDiscountFactor()) * 0.8;
}
else {
for (Dish a : dishes) {
Dish dish = dishes.get(i);
price = dish.getBasePrice();
total = total price;
i ;
}
return total = total * this.guest.getGuestType().getDiscountFactor();
}
}
@Override
public List<Dish> getDishes() {
return dishes;
}
@Override
public Guest getGuest() {
return guest;
}
}
Различные типы блюд:
public enum DishType {
STARTER, MAIN_DISH, DESSERT, OTHER;
}
Мой метод calculatePrice работает так, как задумано (хотя я уверен, что он слишком сложен, но сейчас это не имеет значения для меня).
Единственное, что не работает, это то, что к заказу необходимо применить скидку 20%, если он состоит хотя бы из одного блюда с типом MAIN_DISH, ДЕСЕРТ или ЗАКУСКА.
Мой подход не работает, так как он всегда игнорирует мое первое условие «если».
И я также удивляюсь, почему я не могу позвонить
dishes.getDishType();
точно так же, как я сделал с типами гостей. Я уверен, что это решило бы мою проблему.
Комментарии:
1. Не читая всего этого кода.
getDishes()
звучит как список блюд, и вы сравниваете их с одним типом блюд. Не «кажется» правильным (но, как я уже сказал, я не прочитал весь код)
Ответ №1:
Так dishes
как это список Dish
, вам нужно перебрать их и проверить, есть ли тип какого-либо из них MAIN_DISH
, DESSERT
или STARTER
:
boolean shouldGetDiscount = false;
for (Dish dish : getDishes()) {
DishType type = dish.getDishType();
if (type.equals(DishType.MAIN_DISH) || type.equals(DishType.DESSERT) || type.equals(DishType.STARTER)) {
shouldGetDiscount = true;
break;
}
}
if (shouldGetDiscount) {
//consider the discount
}
Я остро неправильно истолковал инструкции.. вместо получения дополнительной скидки, если это основное блюдо, десерт ИЛИ закуска, вы получаете скидку только в том случае, если это основное блюдо, десерт и закуска.. как вы изменяете его, чтобы он работал именно так?
boolean hasMain = false, hasStarter = false, hasDesert = false;
for (Dish dish : getDishes()) {
DishType type = dish.getDishType();
if (type.equals(DishType.MAIN_DISH))
hasMain = true;
else if (type.equals(DishType.DESERT))
hasDesert = true;
else if (type.equals(DishType.STARTER))
hasStarter = true;
if (hasMain amp;amp; hasDesert amp;amp; hasStarter)
break;
}
if (hasMain amp;amp; hasDesert amp;amp; hasStarter) {
//consider the discount
}
Комментарии:
1. Я остро неправильно истолковал инструкции.. вместо получения дополнительной скидки, если это основное блюдо, десерт ИЛИ закуска, вы получаете скидку только в том случае, если это основное блюдо, десерт и закуска.. как вы изменяете его, чтобы он работал именно так?