2011-06-15 87 views
1

我正在嘗試學習Java,並遇到了本書中列出的練習 中的一個問題。練習要求我使用 ArrayList s創建一個模擬購物車的程序。我已經有 一切正常運行,但是,當我嘗試總計 合計finalPrice時,我得到一個數字是遠離。任何幫助都會很棒。使用arraylist的總計

import java.util.ArrayList; 
import java.util.Scanner; 

public class Shop1 { 
    public static void main(String[]args) { 
     ArrayList <Item> cart = new ArrayList(); 

     Item item; 
     String itemName; 
     double itemPrice; 
     int quantity; 
     double finalPrice = 0; 

     Scanner scan = new Scanner(System.in); 

     String keepShopping = "y"; 

     do { 
      System.out.print("Enter the name of the item: "); 
      itemName = scan.next(); 

      System.out.print("Enter the unit price: "); 
      itemPrice = scan.nextDouble(); 

      System.out.print("Enter the quantity: "); 
      quantity = scan.nextInt(); 

      // create a new item and add it to the cart 
      item = new Item(itemName, itemPrice, quantity); 
      cart.add(item); 

      for (int i = 0; i < cart.size(); i++) { 
       Item temp = cart.get(i); 
       System.out.println(temp); 
       double subTotal = 
        ((temp.getPrice()) * (temp.getQuantity())); 
       finalPrice += subTotal; 

      } 

      System.out.print("Continue shopping (y/n)? "); 
      keepShopping = scan.next(); 
     } while (keepShopping.equals("y")); 

     System.out.println("Please pay: $" + finalPrice); 
    } 
} 

回答

4

你不清除「finalPrice」變量加入之前,所以每次添加一個項目的時候,你開始從以前的所有項目「finalPrice」,然後從那裏添加。

finalPrice =0; 
for (int i=0; i<cart.size(); i++) 
{ 
    Item temp = cart.get(i); 
    System.out.println(temp); 
    double subTotal = ((temp.getPrice()) * (temp.getQuantity())); 
    finalPrice += subTotal; 
} 

由於計數器「i」是不實際需要在這種情況下,你也可以寫代碼更簡潔爲...

finalPrice =0; 
for (Item temp: cart) 
{ 
    System.out.println(temp); 
    double subTotal = ((temp.getPrice()) * (temp.getQuantity())); 
    finalPrice += subTotal; 
} 

不過......既然你更新每個項目後的最終價格,每次添加項目時都不需要遍歷整個列表。你只需要添加的最新商品的價格到目前總,所以你可以簡單地替換...

for (int i=0; i<cart.size(); i++) 
{ 
    Item temp = cart.get(i); 
    System.out.println(temp); 
    double subTotal = ((temp.getPrice()) * (temp.getQuantity())); 
    finalPrice += subTotal; 

} 

隨着

finalPrice += itemPrice * quantity; 
+0

非常有幫助的解釋。謝謝! – Joel 2011-06-15 02:45:18

+0

我沒有得到你答案的最後部分的邏輯:整個「for」陳述簡化爲那一行還是什麼? – mico 2011-06-15 18:57:06

+0

'for'循環在'do-while'循環中。所以每次添加新物品時,他都會瀏覽整個清單並將所有物品的價格加起來。那真的沒有必要。他真正需要做的就是計算最近項目的成本,並將其添加到運行總數中。 另一種選擇是在'while(keepShopping.equals(「y」));'之後,但在'System.out.println(')之前將整個'for'循環移到'do-while' 「請付:$」+ finalPrice);' – Mike 2011-06-16 18:20:24

0

它看起來像你不要在購物車中添加了所有的項目之前重置finalPrice爲零。您的代碼將在第一時間運行,但如果您繼續購物,則不會運行。

0

在進入你的循環之前,你需要將finalPrice調零,否則它會隨着每次迭代呈指數增長。

... 
finalPrice = 0; 
for (int i=0; i<cart.size(); i++) 
...