2017-11-09 4 views
0

メニューから表示された食品アイテムからなる食品注文を作成するプログラムを作成しようとしています。各項目は選択され、特定の量が与えられます。私が選択した項目をJTextFieldに表示したいが、正しく動作していない。私はに走っていると把握することができないよう、いくつかの問題がありますJOptionPaneはArrayListからすべての項目を表示していません

  1. JOptionPaneのは、私はデリのArrayListに追加された項目のすべてを表示することになっているが、それだけで表示されます最初はナチョスです。

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

すべてのヘルプや批判は、私のgetTotalPrice方法が適切にコストを計算していないと私は、なぜ完全にわからない

答えて

1

をいただければ幸いです。

これは

public double getTotalPrice() { 
     double sum = 0; 
    for (Order item : order) { 
     double price = item.getItem().getPrice(); 
     int quantity = item.getQuantity(); 
     sum += (price * quantity); 
    } 
    return 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; 
} 

のような何かの最初の反復後sumの値を返しているという事実によるものですより良い

JOptionPaneは、すべてのt私がdeli arraylistに追加したアイテムですが、最初のものはNachosだけです。

JOptionPaneはあなたのコードではありませんので、それは私がプログラムがアイテムがArrayListの中に既に存在するかどうかを判定し、数量に追加する何の問題が

かもしれません知っていることは不可能ですそうでなければ、arraylistに新しいエントリを追加します。ただし、すでに存在するかどうかにかかわらず常に新しい項目が追加されます。

オーケー、あなたのコードは実際にそれを行うのに十分なサポートを提供していないので、これは、多くの困難です。ItemQtyが作成された後、数量情報を更新するためにあなたのコードのための方法はありません

、あなたはどのあなたが別のItemQtyを渡すために、このアクション(またはaddメソッドを実行するためにいくつかの種類のセッターを供給する必要があるでしょうし、それはありませんあなたのための仕事)

まず、私はItemQty

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

にこの新しいメソッドを追加したいだけの量を増加することが可能となります。あなたはそれにItemquantityに合格しなければならなかったので、

第二に、私はOrder#addToOrderを変更したい、私は(他のクラスが、この場合に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)); 
     } 
    } 

さて、それは私を行いますが、基本的には、それは言うためだけの派手なpancyの方法です...

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)); 
    } 
} 
関連する問題