如何在Main类中动态访问实例化类中HashMap的键值对
Java银行模拟程序修复:printAllCustomerData()方法问题
问题需求
我实现了包含Bank、BankAccount和Main类的Java银行模拟程序,但Bank类的printAllCustomerData()方法存在问题。需要该方法能够从Main类实例化的BankAccount对象动态获取HashMap的键值对,输出如下格式的客户账户信息:
Customer Woods has $95.00 in account #abc111 Customer Gates has $222.22 in account #def222 Customer Bezos has $305.00 in account #ghi333 Customer Zuckerberg has $400.00 in account #jkl444 Total bank balance in all accounts for Bank of Kanada is 1022.22
现有代码
BankAccount.java
/** * 模拟具备存款、取款和转账功能的银行账户程序 */ public class BankAccount { private double balanceCad; private final String accountNumber; private final String lastName; /** * @param balanceCad 账户余额(加元) * @param accountNumber 唯一的银行账号 * @param lastName 账户所有者的姓氏 */ public BankAccount(final double balanceCad, final String accountNumber, final String lastName) { this.balanceCad = balanceCad; this.accountNumber = accountNumber; this.lastName = lastName; } /** * 从账户中取款(加元) * @param amountCad 取款金额(加元) */ public void withdrawMoneyCad(double amountCad) { this.balanceCad -= amountCad; } /** * 向账户中存款(加元) * @param amountCad 存款金额(加元) */ public void depositMoneyCad(double amountCad) { this.balanceCad += amountCad; } /** * 向另一个银行账户转账(加元) * @param amountCad 转账金额(加元) * @param recipientAccount 接收转账的账户对象 */ public void transferMoneyCad(double amountCad, final BankAccount recipientAccount) { recipientAccount.depositMoneyCad(amountCad); this.withdrawMoneyCad(amountCad); } // 访问器方法 /** * @return 账户余额(加元) */ public double getBalanceCdn() { return balanceCad; } /** * @return 唯一的银行账号 */ public String getAccountNumber() { return accountNumber; } /** * @return 账户所有者的姓氏 */ public String getMemberLastName() { return lastName; } }
Bank.java
/** * 模拟管理多个银行账户信息的银行程序 */ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Bank { private final String bankName; private final Map<String, BankAccount> bankAccounts; public Bank(final String bankName) { this.bankName = bankName; this.bankAccounts = new HashMap<>(); } public void addAccount(BankAccount newBankAccount) { this.bankAccounts.put(newBankAccount.getAccountNumber(), newBankAccount); } public BankAccount getAccount(String accountNumber) { return this.bankAccounts.get(accountNumber); } public void removeAccount(String accountNumber) { this.bankAccounts.remove(accountNumber); } public int getNumberOfAccounts() { return this.bankAccounts.size(); } public double getTotalAccountsBalance() { double totalCdn = 0.0; for (BankAccount account : this.bankAccounts.values()) { totalCdn += account.getBalanceCdn(); } return totalCdn; } public void depositTo(double amountCdn, String accountNumber) { this.bankAccounts.get(accountNumber).depositMoneyCad(amountCdn); } public void printAllCustomerData() { final Iterator<String> it; it = this.iterator(); while (it.hasNext()) { final String theNextKey; theNextKey = it.next(); System.out.printf("Customer %s has $%.2f in account #%s\n", theNextKey, bankAccounts.get(theNextKey), accountNumber); } System.out.printf("Total bank balance in all accounts for %s is %.2f\n", this.bankName, this.getTotalAccountsBalance()); } }
Main.java
public class Main { public static void main(final String[] args) { final Bank bank; final BankAccount account1; final BankAccount account2; final BankAccount account3; final BankAccount account4; bank = new Bank("Bank of Kanada"); account1 = new BankAccount(100.0, "abc111", "woods"); account2 = new BankAccount(200.0, "def222", "gates"); account3 = new BankAccount(300.0, "ghi333", "bezos"); account4 = new BankAccount(400.0, "jkl444", "zuckerberg"); bank.addAccount(account1); bank.addAccount(account2); bank.addAccount(account3); bank.addAccount(account4); bank.depositTo(22.22, "def222"); bank.getAccount("abc111").transferMoneyCad(5.00, bank.getAccount("ghi333")); bank.printAllCustomerData(); } }
问题分析与修复
原printAllCustomerData()方法存在以下几个问题:
this.iterator()方法不存在:Bank类未实现Iterable接口,无法直接调用该方法,应从bankAccounts的集合中获取迭代器或直接遍历集合。- 变量
accountNumber未定义:代码中直接使用该变量,但未在方法内声明。 - 数据获取错误:
theNextKey是HashMap的键(即账号),不是客户姓氏;直接输出bankAccounts.get(theNextKey)会打印对象引用,而非账户余额。 - 姓氏格式不匹配:Main类传入的姓氏为小写,需要处理为首字母大写以符合预期输出。
修复后的printAllCustomerData()方法
public void printAllCustomerData() { // 遍历所有BankAccount对象,无需通过键值对间接获取 for (BankAccount account : bankAccounts.values()) { // 将姓氏转换为首字母大写格式 String lastName = account.getMemberLastName(); String capitalizedLastName = lastName.substring(0, 1).toUpperCase() + lastName.substring(1); System.out.printf("Customer %s has $%.2f in account #%s\n", capitalizedLastName, account.getBalanceCdn(), account.getAccountNumber()); } System.out.printf("Total bank balance in all accounts for %s is %.2f\n", this.bankName, this.getTotalAccountsBalance()); }
额外优化建议
原depositTo方法未判断账号是否存在,可能触发空指针异常,建议添加检查:
public void depositTo(double amountCdn, String accountNumber) { BankAccount account = this.bankAccounts.get(accountNumber); if (account != null) { account.depositMoneyCad(amountCdn); } else { System.out.println("账户不存在:" + accountNumber); } }
内容的提问来源于stack exchange,提问作者sjord01
相关产品推荐
相关产品推荐

