JOptionPane不显示ArrayList中的所有项目

时间:2017-11-09 22:55:35

标签: java joptionpane

我正在尝试编写一个程序,该程序将创建一个包含从菜单中显示的食物项目的食物订单。选择每个项目并给予一定数量。我想显示我在JTextField中选择的项目,但它没有正常工作。

我遇到了一些问题似乎无法弄清楚,

  1. JOptionPane应该显示我添加到熟食列表中的所有项目,但它只显示第一个是Nachos的项目。

  2. 我的getTotalPrice方法无法正确计算成本,我不完全确定原因。

  3. 我希望程序确定某个项目是否已存在于Arraylist中并添加到数量中,如果没有,则添加一个新条目到arraylist。但是,它总是添加一个新项目,无论它是否已存在。

  4. 以下是我的所有课程文件。

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

    任何帮助或批评都将不胜感激

1 个答案:

答案 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));
    }
}