【问题标题】:JOptionPane not displaying all items from ArrayListJOptionPane 不显示 ArrayList 中的所有项目
【发布时间】:2017-11-09 22:55:34
【问题描述】:

我正在尝试编写一个程序,该程序将创建一个由菜单中显示的食品组成的食品订单。每个项目都被选中并赋予一定的数量。我想显示我在 JTextField 中选择的项目,但它没有正常工作。

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

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

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

  3. 我希望程序确定一个项目是否已经存在于 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;
}
}

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

【问题讨论】:

    标签: java joptionpane


    【解决方案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 后,您的代码无法更新数量信息,您需要提供某种类型的设置器来执行此操作(或 add 方法,您将另一个 @ 传递给该方法987654327@ 它会为您完成这项工作)

    首先,我要向ItemQty 添加一个新方法

    public class ItemQty {
        //...
        public void add(int quantity) {
            this.quantity += quantity;
        }
    }
    

    这只是为了增加数量。

    其次,我会更改Order#addToOrder,我会这样做,因此您必须将Itemquantity 传递给它(其他类不需要在其中创建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));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多