You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:55:10