【问题标题】:Java application grocery ordering logic with OOP带有 OOP 的 Java 应用程序杂货订购逻辑
【发布时间】:2020-08-15 13:53:21
【问题描述】:

我正在做一个杂货订购系统,但订购逻辑有问题。

目前,该程序会询问客户他们想要订购多少杂货,但我发现这是一种订购方式,无需在一开始就指定要订购的订单数量。

有人知道吗?谢谢。

下面是驱动类Shop.java

package groceries.ordering.system;


import java.util.*;


public class Shop {
    
    public static void main(String[] args){
        
        Scanner myScanner = new Scanner(System.in);
      
        Category[] groceries = {new Category("Apple 1pcs", 1.5, "Fruit"),
                                new Category("Orange 1pcs", 1.4, "Fruit"),
                                new Category("Egg 10pcs", 8, "Dairy"),
                                new Category("Full Cream Milk", 6.5, "Dairy"),
                                new Category("Olive Oil 1L", 30, "Cooking Oil"),
                                new Category("Palm Oil 1L", 20, "Cooking Oil")};
                            
                   
        displayMenu(groceries);

        System.out.print("How many groceries you would like to order: ");
        int totalGroceries = myScanner.nextInt();
        
        OrderItem[] items = new OrderItem[totalGroceries];
        
        for(int i=0;i<items.length;i++){
        System.out.println("Enter your choice of groceries (1 - 6) : ");
        int choice = myScanner.nextInt()-1;
        System.out.println("Enter quantity ordered: ");
        int quantity = myScanner.nextInt();
        
        items[i] = new OrderItem(groceries[choice],quantity);
      }
        
        Order order = new Order(items,totalGroceries);
          displayOrderItem(items);
          System.out.printf("%65s %9.2f\n", "Grand Total: ", order.getGrandTotalPrice());

    } 

     public static void displayMenu(Groceries[] groceries){
        
        System.out.printf("\t========================================\n");
        System.out.printf("\tWelcome to the Groceries Ordering System\n");
        System.out.printf("\t========================================\n");
        System.out.printf("%-10s %-25s %-11s %s \n\n", "No", "Groceries", "Price(RM)", "Category");
        for(Groceries grocery : groceries){
            System.out.println(grocery.displayMenu());
            
        }
        System.out.println("\n");
    }
     
     public static void displayOrderItem(OrderItem[] items){
        System.out.printf("\n\t\t\t\t Ordered Item\n");
        System.out.printf("\t\t\t\t===============\n");
        System.out.printf("%-10s %-20s %-14s %-13s %-13s\n", "No","Groceries", "Price(RM)","Quantity","Total Price(RM)");
        System.out.printf("--------------------------------------------------------------------------------------\n");
        for(OrderItem item : items){
            System.out.println(item.displayOrder());
        }
        System.out.printf("--------------------------------------------------------------------------------------\n");
    }     
       
}

这是杂货类(不会发布此类的子类(类别),因为我认为没有任何相关性)

package groceries.ordering.system;


public abstract class Groceries {
    
    private String name;
    private double price;

    public Groceries() {
        this("",0);
    }
    
    public Groceries(String prodName, double prodPrice){
        super();
        name = prodName;
        price = prodPrice;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public String displayMenu(){
        return String.format("%-25s %-11.2f ", name,price);
    }


}

这是 OrderItem 类

public class OrderItem {
    
    private Groceries groceries;
    private int quantity;
    private static int prodCount = 1;
    
    public OrderItem(Groceries groceries, int quantity) {
        this.groceries = groceries;
        this.quantity = quantity;
    }
    
    public double getUnitPrice(){
     return groceries.getPrice();
        
    }
    
    public double getSubTotalPrice(){
        return getUnitPrice() * quantity;
    }
    

    public String displayOrder() {
        return String.format("%-10d %-20s %9.2f %13d %19.2f",prodCount++, groceries.getName(),
                              getUnitPrice(),quantity,getSubTotalPrice());
    }
}

最后是 Order 类

public class Order {
    
    private OrderItem[] items;
    private int totalItem;

    
    public Order(OrderItem[] items, int totalItem) {
        this.items = items;
        this.totalItem = totalItem;
    }

    
    public double getGrandTotalPrice() {
        double price = 0.0;
        for (OrderItem item : items) {
            price += item.getSubTotalPrice();
        }
        return price;
    }
       
}

【问题讨论】:

    标签: java arrays oop methods logic


    【解决方案1】:

    当然。您可以通过两种方式实现。

    1. 事先创建一个非常大的数组(不推荐)。
    2. 使用一些 ListArrayListLinkedList 或其他东西)并继续添加项目直到用户完成。

    List<OrderItem> items = new ArrayList<>();
        
    do {
        System.out.println("Enter your choice of groceries (1 - 6) : ");
        int choice = myScanner.nextInt()-1;
        System.out.println("Enter quantity ordered: ");
        int quantity = myScanner.nextInt();
        
        items.add(new OrderItem(groceries[choice],quantity));
    
        // compute shouldContinue - something like asking the user to enter -1 to quit.
    } while(shouldContinue);
       
      
    

    【讨论】:

    • 非常感谢!我使用 ArrayList 解决了逻辑问题。
    【解决方案2】:

    是的,在数组下方使用 ArrayListLinkedList 的 List 实现并使用其功能:

    替换这个 - OrderItem[] items = new OrderItem[totalGroceries];

    使用 ArrayList-List&lt;OrderItem&gt; items = new ArrayList&lt;&gt;();

    如果您想在多线程环境中运行此应用程序,也可以使用CopyOnWriteArrayList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      相关资源
      最近更新 更多