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

如何在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()方法存在以下几个问题:

  1. this.iterator()方法不存在:Bank类未实现Iterable接口,无法直接调用该方法,应从bankAccounts的集合中获取迭代器或直接遍历集合。
  2. 变量accountNumber未定义:代码中直接使用该变量,但未在方法内声明。
  3. 数据获取错误:theNextKey是HashMap的键(即账号),不是客户姓氏;直接输出bankAccounts.get(theNextKey)会打印对象引用,而非账户余额。
  4. 姓氏格式不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:08:12