我正在尝试编写一个程序,该程序将创建一个包含从菜单中显示的食物项目的食物订单。选择每个项目并给予一定数量。我想显示我在JTextField中选择的项目,但它没有正常工作。
我遇到了一些问题似乎无法弄清楚,
JOptionPane应该显示我添加到熟食列表中的所有项目,但它只显示第一个是Nachos的项目。
我的getTotalPrice方法无法正确计算成本,我不完全确定原因。
我希望程序确定某个项目是否已存在于Arraylist中并添加到数量中,如果没有,则添加一个新条目到arraylist。但是,它总是添加一个新项目,无论它是否已存在。
以下是我的所有课程文件。
import java.util.ArrayList;
public class Menu {
private final ArrayList<Item> menu;
public Menu() {
menu = new ArrayList<>();
}
public void addItem(Item item) {
menu.add(item);
}
public Item getItem(int itemNo) {
if (menu.size() > itemNo) {
return menu.get(itemNo);
}
return null;
}
@Override
public String toString() {
for (int i = 0; i < menu.size(); i++) {
return String.format("%s: %s \n",i+1, menu.get(i));
}
return null;
}
}
public class Item {
private final String name;
private final double price;
public Item(String name, double price) {
this.name = name;
this.price = price;
}
public double getPrice() {
return price;
}
@Override
public String toString() {
return String.format("Name %s @ Price $%s", name, price);
}
public boolean equals(Item item) {
return item.name.equals(item.name);
}
}
public class ItemQty {
private final Item item;
private final int quantity;
public ItemQty(Item item, int quantity) {
this.item = item;
this.quantity = quantity;
}
public Item getItem() {
return item;
}
public int getQuantity() {
return quantity;
}
@Override
public String toString() {
return String.format("%s - %s\n", quantity, item);
}
public boolean equals(ItemQty itemQty) {
return itemQty.getItem().equals(itemQty.getItem());
}
}
import java.util.ArrayList;
public class Order {
private final ArrayList<ItemQty> order;
public Order() {
order = new ArrayList<>();
}
public void addToOrder(ItemQty itemQty) {
if (order.contains(itemQty)) {
int amount = itemQty.getQuantity();
amount += 1;
}
else
order.add(itemQty);
}
public double getTotalPrice() {
for (int index = 0; index < order.size(); index++) {
double price = order.get(index).getItem().getPrice();
int quantity = order.get(index).getQuantity();
double sum = price * quantity;
return sum;
}
return 0;
}
@Override
public String toString() {
String str = "";
for (int index = 0; index < order.size(); index++) {
str += order.get(index).toString() + "\n\n";
}
return str;
}
}
任何帮助或批评都将不胜感激
答案 0 :(得分:1)
我的getTotalPrice方法没有正确计算成本,我不完全确定原因。
这是因为您只在循环的第一次迭代后返回sum
的值
public double getTotalPrice() {
for (int index = 0; index < order.size(); index++) {
double price = order.get(index).getItem().getPrice();
int quantity = order.get(index).getQuantity();
double sum = price * quantity;
return sum;
}
return 0;
}
像...一样的东西。
public double getTotalPrice() {
double sum = 0;
for (Order item : order) {
double price = item.getItem().getPrice();
int quantity = item.getQuantity();
sum += (price * quantity);
}
return sum;
}
会更好用
JOptionPane应该显示我添加到熟食列表中的所有项目,但它只显示第一个是Nachos的项目。
由于您的代码中没有JOptionPane
,因此无法知道问题可能是什么
我希望程序确定某个项目是否已存在于Arraylist中并添加到数量中,如果没有,则添加一个新条目到arraylist。但是,它始终会添加一个新项目,无论它是否已存在。
好的,这要困难得多,因为你的代码并没有提供足够的支持来实现它。
创建ItemQty
后,您的代码无法更新数量信息,您需要提供某种类型的setter来执行此操作(或add
方法,你传递了另一个ItemQty
,它为你完成了工作)
首先,我要为ItemQty
public class ItemQty {
//...
public void add(int quantity) {
this.quantity += quantity;
}
}
这样可以增加数量。
其次,我要更改Order#addToOrder
,我会这样做,所以你必须传递一个Item
和一个quantity
(其他类不需要制作)在这种情况下为ItemQty
对象)。在这种方法中,我会搜索匹配的项目,然后更新它或将其添加到订单中。
public class Order {
//...
public void addToOrder(Item item, int quantity) {
List<ItemQty> matches = order.stream().filter((itemQty) -> {
return itemQty.getItem().equals(item);
}).collect(Collectors.toList());
if (matches.size() > 0) {
matches.get(0).add(quantity);
} else {
order.add(new ItemQty(item, quantity));
}
}
好吧,那可能让你摸不着头脑,它对我有用,但基本上,这只是一种花哨的泛音方式...
public void addToOrder(Item item, int quantity) {
ItemQty match = null;
for (ItemQty check : order) {
if (check.getItem().equals(item)) {
match = check;
break;
}
}
if (match != null) {
match.add(quantity);
} else {
order.add(new ItemQty(item, quantity));
}
}