2017-11-09 5 views
0

메뉴에서 표시된 음식 항목으로 구성된 음식 주문을 만드는 프로그램을 작성하려고합니다. 각 항목이 선택되고 특정 수량이 지정됩니다. JTextField에서 선택한 항목을 표시하려고하지만 올바르게 작동하지 않습니다. 내가 우연히하고 알아낼 수없는 몇 가지 문제가 있습니다JOptionPane이 ArrayList의 모든 항목을 표시하지 않습니다.

,

  1. JOptionPane에 내가 델리의 ArrayList에 추가 된 모든 항목을 표시하기로되어 있지만 그것은 단지 표시 첫 번째는 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; 
} 
} 

어떤 도움이나 비판은

답변

1

내 getTotalPrice 방법이 제대로 비용을 계산하지 않고 내가 왜 완전히 확실하지 않다 감상 할 수있다.

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 그는 델리 arraylist에 추가 한 항목이지만 나초 인 첫 번째 항목 만 표시합니다. 코드에서 더 JOptionPane가 없기 때문에

, 그것은 문제가

내가 프로그램 항목이 이미 ArrayList의 존재 여부를 결정하고, 수량에 추가 할 수 있습니다 알고 불가능 만약 그렇다면, arraylist에 새로운 항목을 추가하십시오. 그러나 이미 존재하는지 여부에 관계없이 항상 새 항목을 추가합니다.

그래, 코드가 실제로 그렇게하기에 충분한 지원을 제공하지 않기 때문에 이것은 훨씬 어렵습니다.

는 다른 ItemQtyItemQty 만든 후 양의 정보를 업데이트하는 코드는,이 작업 (또는 add 방법을 수행하는 몇 가지 종류의 세터를 제공해야합니다있는 방법이 없습니다

을 통과 그것은 않습니다 당신을위한 작업)

첫째, 나는이 그냥 가능 수량을 증가 할 수 ItemQty

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

에 새로운 방법을 추가 할 것입니다.

둘째, 나는 Order#addToOrder을 변경 거라고, 나는 그렇게 당신이 (다른 클래스는이 경우에 ItemQty 객체를 할 필요가 없습니다) 그에게 Itemquantity을 통과했다 만들 것입니다. 이 방법에서는 일치하는 항목을 검색하여 업데이트하거나 순서에 추가합니다.

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)); 
    } 
} 
관련 문제