2013-12-08 1 views
-1

간단한 시스템까지 코드를 작성하고 있습니다. 현재 야채는 ArrayList입니다. 야채는 매개 변수로 이름과 가격 만 있습니다.자바에서 두 가지 제안을 할 때를 식별하는 방법

vegList.add(new Vegetable("Aubergine", 1.50)); 
    vegList.add(new Vegetable("Tomato", 1)); 
    vegList.add(new Vegetable("Cucumber", 0)); 

현재는 세 Aubegines 한 토마토 내 쇼핑 카트에 있습니다.

나는 트롤리에서 야채의 이름을 확인한 다음 가격을 반환하는 방법이 있지만 내 문제는 ... 나는 Aubergines가 3 개 있고 Aubergines가 £ 1에 대해 2라고 들었다.

내 수량 변수가 2에 도달하면 가격 매개 변수를 1로 변경 한 다음 Aubergines를 추가 할 때 £ 1.50에서 계속 2의 배수 (이 경우에는 4)가 될 때까지 계속한다고 말하면서 방법을 수정할 수 있습니까? .

public double getVegetablePrice(String name) { 
    // Iterate through ArrayList 
    // Get current index 
    // Get Fruit name 
    // Get price based on Fruit name 
    // return price of Fruit 

    double price = 0; 
    double count = 0; 
    double quantity = 0; 

    for(int i = 0; i < vegList.size(); i++){ 
     Vegetable tempVeg = vegList.get(i); 

     if(tempVeg.getName() == name){ 
      if(name.equals("Tomato")) { 
       count = tempVeg.getPrice(); 
       price += (count * 1.0); //£1 per kg 
      } 

      else if(name.equals("Aubergine")) { 
       quantity++; //ADD TO QUANTITY 
       if(quantity == 2) { 
        price = 1.0; 
       } 
       else { 
        price = tempVeg.getPrice(); 
       } 
      } 
     } 

     else{ 
      // do nothing 
     } 
    } 
    return price; 
} 

내가 현재 £ 5.50의 총 assertTrue(vegTotal == 3.50) 얻고 것 JUnit 테스트를 위해 이것을 쓰고 있습니다 ... 아래 코드를 참조하십시오.

+0

그래서 £ 1.50에 대해 £ 1 또는 £ 2를 얻을 수 있습니까? 두 개를 사면 둘 다 먹어야합니까? –

+0

구아바의 ['MultiSet'] (http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained) 중 하나가 계산에 도움이됩니다. – zapl

답변

0

와 aubergines를 들어, 가격에 대한 수량이 있어야한다 : 당신은 내가 당신에게 떠날 것을 통합하는 방법

int pricingQuantity = quantity/2 + quantity % 2; 

.


코드에 지저분한 일부 결함이 있습니다. "n에 1"값이있는 식료품 아이템과 위의 계산을 사용하는 가격 방법이있는 카트 아이템에 대한 클래스를 갖는 클래스를 고려하십시오.

0

을 랩핑하는 ShoppingCart 클래스를 사용하면 항목을 장바구니에 추가 할 때 수량을 제어 할 수 있다는 이점이 있다고 생각합니다. 이렇게하면 시나리오와 같은 항목 번들의 계산을 단순화 할 수 있습니다. 예를 들어

, 간단한 (주 : 테스트하지) :

class ShoppingCart 
    private List<Vegetable> items; 
    private Map<String, Integer> quantities; 

    public ShoppingCart() { 
     items = new ArrayList<Vegetable>(); 
     quantities = new HashMap<String, Integer>(); 
    } 

    public addItem(Vegetable v) { 
     items.add(v); 
     //Update quantities 
     if (quantities.containsKey(v.getName()) { 
      quantities.put(v.getName(), ++quantities.get(v.getName())); 
     } else { 
      quantities.put(v.getName(), 1); 
     } 
    } 

    //TODO: Implement removeItem() and decrement quantities 

    public Double getItemPrice(Vegetable v) { 
     return items.contains(v) ? v.getPrice() : 0; 
    } 


    public Double getItemPrice(Vegetable v) { 
     itemPrice = getItemPrice(v); 

     if (itemPrice > 0) { 
      int quantity = quantities.get(v.getName()); 

      if (v.getName().equals("Aubergine")) { 
       int bundles = quantity/2; 
       int remaining = quantity % 2; 
       return bundles * 1 + remaining * itemPrice; 
      } 

      //do the rest of the code here 

     } 
    } 

} 

그러나 당신은 또한 당신의 Vegetable 클래스에서 구현 된 "번들"가격의 논리를 가지고 있어야 당신의 사건을 해결하기 위해 구현 될 수있다. 이상적으로는 Vegetable을 추상 클래스로 만들고 각 채소를 구현하는 클래스로 만들어야합니다. 당신이 AubergineVegetable를 구현하는 클래스를 만들 경우

예를 들어, 당신은 양 매개 변수 2.

이 방법을 하나의 가격을 정의 할 getBundlePrice(int quantity)Aubergine 그 구현하는 추상 메소드를 만들 수 있습니다, 당신은하지 않습니다 getItemPrice() 방법으로 채소 종류에 대한 모든 검사를해야합니다. 대신, v.getBundlePrice(quantity)으로 전화하면 자동으로 계산됩니다.

희망이 있습니다.

관련 문제