2016-09-07 32 views
2

私は抽象クラスTransactionを持っています。ここではそれぞれの合計金額を計算したいと思いますTransaction。合計金額は、Productの価格をMapにして計算し、その金額にそれぞれの金額を掛けて計算します。Product私はちょうどMapの値である量によってこれらの価格を掛ける方法を知らない。誰でも助けてくれますか?私はほとんどすべてを試み、何も働かない。合計金額を計算する

public abstract class Transaction 
{ 
    //Attributes 
    ... 

    //Links 

    Map<Product,Integer> products; 

    //Constructor 

    Transaction() 
    { 
     id = newTrId.incrementAndGet(); 
     date = new Date(); 
     products = new HashMap<>(); 
    } 

    abstract void addProduct(Product aProduct, int aQuantity); 


    BigDecimal calculateTotal() 
    { 
     BigDecimal total = new BigDecimal(0); 

     for(Product eachProduct : products.keySet()) 
     { 
      total.add(eachProduct.getPrice()); 
     } 
     for (Integer eachProduct : products.values()) 
     { 

     } 

     return total; 
    } 
} 
+1

'(eachProduct.getPrice()* products.get(eachProduct))をtotal.add;'これが '' products'地図で 'Integer'をつかむだろう'eachProduct'の価格で乗算します。 'for-each'ループに別のループを追加するのではなく、それを追加してください。 – Orin

答えて

0

私はちょうどMapの値として ある量で、これらの価格を乗算する方法がわかりません。誰でも助けてくれますか?

それはあなたのMapのこのようにその価格で数量(Mapの値)を乗算するために、エントリを反復することによって行うことができます

BigDecimal calculateTotal() { 
    BigDecimal total = new BigDecimal(0); 
    for (Map.Entry<Product, Integer> entry : products.entrySet()) { 
     total = total.add(
      BigDecimal.valueOf(entry.getKey().getPrice()).multiply(
       BigDecimal.valueOf(entry.getValue()) 
      ) 
     ); 
    } 
    return total; 
} 

NB: I Product#getPrice()doubleを返すとします。 BigDecimalとして

NB 2不変である、あなたは各反復で再割り当てあなたの変数totalを必要としています。

NB 3計算の精度が失われないようにするには、すべてをBigDecimalに変換する必要があります。

0

あなたは近くにいました。ここで見てみましょう:

BigDecimal calculateTotal() 
{ 
    BigDecimal total = new BigDecimal(0); 

    for(Product eachProduct : products.keySet()) 
    { 
     total.add(eachProduct.getPrice() * products.get(eachProduct)); 
    } 

    return total; 
} 

唯一の違いは、この行です:total.add(eachProduct.getPrice() * products.get(eachProduct));

私はProductに関連付けられたマップからIntegerをつかむために、これを追加しました。

Java 8を使用している場合は、ストリームも作成できます。

total = new BigDecimal(map.keySet() 
    .stream().mapToDouble(product -> product.getPrice() * products.get(product)) 
    .sum()); 
+0

ありがとうございます。NetBeansでは、これを実行するとdoubleをBigDecimalに変換できないと言われています。 – Joanna

+0

うん、それをテストしたときにうまくいった。 Java 8を使用していますか? – Orin

1

BigDecimal不変で、add、それが呼び出されたオブジェクトを変更しません。だから、addの結果を再割り当てする必要があります。

BigDecimal calculateTotal() { 
    BigDecimal total = new BigDecimal(0); 
    for (Map.Entry<Product, Integer> entry : products.entrySet()) { 
    total = total.add(BigDecimal.valueOf(entry.getKey().getPrice() * entry.getValue())); 
    } 
    return total; 
} 
関連する問題