Java开发:如何在while循环中计算用户输入的每日支出总和
解决方法
首先你现有代码存在一个明显错误:最后遍历支出的for循环中,你误用了局部变量newExpense作为遍历对象,它仅在while循环内部有效,外部无法访问,应该改为遍历全局的expenses ArrayList。
下面提供两种实现支出总和统计的简单方案:
方案一:添加支出时实时累加总和
在main方法开头定义一个总和变量,每次新增支出时直接累加对应金额,最后直接打印结果:
import java.util.Scanner; import java.util.ArrayList; public class DailyExpensesMain { public static void main(String[] args) { ArrayList<DailyExpenses> expenses = new ArrayList<DailyExpenses>(); Scanner sc = new Scanner(System.in); boolean isRunning = true; // 初始化总支出为0 double totalExpenses = 0.0; System.out.println("Enter the date for which you want to record the expenses : "); String date = sc.nextLine(); while(isRunning) { System.out.println("Enter category: (quit to exit)"); String category = sc.nextLine(); if(category.equalsIgnoreCase("quit")) { break; } System.out.println("Enter price: "); double price = sc.nextDouble(); // 实时累加当前支出金额 totalExpenses += price; sc.nextLine(); System.out.println("Enter details: "); String detail = sc.nextLine(); DailyExpenses newExpense = new DailyExpenses(date, category, price, detail); expenses.add(newExpense); } sc.close(); // 遍历全局的expenses列表打印明细 for(DailyExpenses u: expenses) { System.out.println("Date: " + u.getDate() + " Category: " + u.getExpenseCategory() + " Price: " + u.getExpensePrice() + " Detail: " + u.getExpenseDetail()); } // 格式化打印总支出,保留两位小数 System.out.printf("Total Expenses: %.2f%n", totalExpenses); } }
方案二:循环结束后遍历列表计算总和
如果不想在添加阶段累加,也可以在程序末尾遍历expenses列表,逐个取出金额求和:
import java.util.Scanner; import java.util.ArrayList; public class DailyExpensesMain { public static void main(String[] args) { ArrayList<DailyExpenses> expenses = new ArrayList<DailyExpenses>(); Scanner sc = new Scanner(System.in); boolean isRunning = true; System.out.println("Enter the date for which you want to record the expenses : "); String date = sc.nextLine(); while(isRunning) { System.out.println("Enter category: (quit to exit)"); String category = sc.nextLine(); if(category.equalsIgnoreCase("quit")) { break; } System.out.println("Enter price: "); double price = sc.nextDouble(); sc.nextLine(); System.out.println("Enter details: "); String detail = sc.nextLine(); DailyExpenses newExpense = new DailyExpenses(date, category, price, detail); expenses.add(newExpense); } sc.close(); // 计算总支出 double totalExpenses = 0.0; for(DailyExpenses expense : expenses) { totalExpenses += expense.getExpensePrice(); // 同时打印支出明细 System.out.println("Date: " + expense.getDate() + " Category: " + expense.getExpenseCategory() + " Price: " + expense.getExpensePrice() + " Detail: " + expense.getExpenseDetail()); } // 格式化打印总支出 System.out.printf("Total Expenses: %.2f%n", totalExpenses); } }
两种方案都能满足需求,第一种仅需一次遍历效率更高,第二种逻辑更直观,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者ProgrammingTillSuccess
相关产品推荐
相关产品推荐

