尚硅谷 Java 基础实战—Bank 项目—实验题目 8(Iterator迭代实现)

简介: 尚硅谷 Java 基础实战—Bank 项目—实验题目 8(Iterator迭代实现)

实验题目

将替换这样的数组代码:这些数组代码用于实现银行和客户间,以及客户与他们 的帐户间的关系的多样性。

image.png

实验目的

使用集合

提示

修改 Bank 类

修改 Bank 类,利用 ArrayList 实现多重的客户关系,不要忘记倒入必须的 java.uti类。

  1. 将 Customer 属性的声明修改为List 类型,不再使用 numberOfCustomers 属性。
  2. 修改 Bank 构造器,将 customers 属性的声明修改为List 类型,不再使用 numberOfcustomers 属性。
  3. 修改 addCustomer 方法,使用 add 方法 。
  4. 修改 getCustomer 方法,使用 get 方法。
  5. 修改 getNumofCustomer 方法,使用 size 方法

修改 Customer 类。

  1. 修改 Customer 类,使用 ArrayList 实现多重的账户关系。修改方法同上。

编译运行 TestBanking 程序这里,不必修改 CustomerReport 代码,因为并没有改变 Bank 和 Customer 类的接口。编译运行TestBanking 应看到下列输出结果:

CUSTOMERSREPORT================Customer: Simms, JaneSavingsAccount: currentbalanceis¥500.0CheckingAccount: currentbalanceis¥200.0Customer: Bryant, OwenCheckingAccount: currentbalanceis¥200.0Customer: Soley, TimSavingsAccount: currentbalanceis¥1500.0CheckingAccount: currentbalanceis¥200.0Customer: Soley, MariaCheckingAccount: currentbalanceis¥200.0SavingsAccount: currentbalanceis¥150.0

代码

【Account.java】类

packagebanking;
importbanking.domain.OverdraftException;
publicclassAccount {
protecteddoublebalance;    //银行帐户的当前(或即时)余额//公有构造器 ,这个参数为 balance 属性赋值publicAccount(doubleinit_balance) {
this.balance=init_balance;
    }
//用于获取经常余额publicdoublegetBalance() {
returnbalance;
    }
/*** 向当前余额增加金额* @param amt   增加金额* @return  返回 true(意味所有存款是成功的)*/publicbooleandeposit(doubleamt){
balance+=amt;
returntrue;
    }
/*** 从当前余额中减去金额* @param amt   提款数目* @return  如果 amt小于 balance, 则从余额中扣除提款数目并返回 true,否则余额不变返回 false。*/publicvoidwithdraw(doubleamt) throwsOverdraftException {
if (amt<balance){
balance-=amt;
        }else{
thrownewOverdraftException("资金不足",balance-amt);
        }
    }
}

【Customer.java】类

packagebanking;
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;
publicclassCustomer {
privateStringfirstName;
privateStringlastName;
privateList<Account>accounts=newArrayList<>();
publicCustomer(Stringf, Stringl) {
this.firstName=f;
this.lastName=l;
    }
publicStringgetFirstName() {
returnfirstName;
    }
publicStringgetLastName() {
returnlastName;
    }
/*** 通过下标索引获取 account* @param index 下标索引* @return account*/publicAccountgetAccount(intindex) {
returnaccounts.get(index);
    }
/*** 获取 accounts 集合的大小* @return  accounts.size()*/publicintgetNumOfAccounts() {
returnaccounts.size();
    }
/*** 方法返回一个帐户列表上的 iterator* @return  方法返回一个帐户列表上的 iterator*/publicIterator<Account>getAccounts(){
returnaccounts.iterator();
    }
/*** 添加 account* @param acct  account*/publicvoidaddAccount(Accountacct) {
accounts.add(acct);
    }
}

【Bank.java】类

packagebanking;
importjava.util.ArrayList;
importjava.util.Iterator;
importjava.util.List;
/*** 银行类*/publicclassBank {
privateList<Customer>customers;   //Customer对象的数组privatestaticBankbankInstance=null;
/***  getBanking 的公有静态方法,它返回一个 Bank 类的实例。* @return 返回一个 Bank 类的实例。*/publicstaticBankgetBank(){
if(bankInstance==null){
bankInstance=newBank();
        }
returnbankInstance;
    }
/*** 单例模式中构造器也应该是私有的,以合适的最大尺寸(至少大于 5)初始化 customers 数组。*/privateBank() {
customers=newArrayList<>();
    }
/***  该方法必须依照参数(姓,名)构造一个新的 Customer 对象然后把它放到 customer 数组中。还必须把 numberOfCustomers 属性的值加 1。* @param f 姓* @param l 名*/publicvoidaddCustomer(Stringf,Stringl){
customers.add(newCustomer(f,l));
    }
/**** @return 返回一个客户列表上的 iterator*/publicIterator<Customer>getCustomers(){
returncustomers.iterator();
    }
/*** 通过下标索引获取 customer* @param index 下标索引* @return  customer*/publicCustomergetCustomer(intindex) {
returncustomers.get(index);
    }
publicintgetNumOfCustomers() {
returncustomers.size();
    }
}

【CheckingAccount.java】类

packagebanking;
importbanking.domain.OverdraftException;
publicclassCheckingAccountextendsAccount{
privatedoubleoverdraftProtection;
publicCheckingAccount(doublebalance) {
super(balance);
    }
publicCheckingAccount(doublebalance, doubleprotect) {
super(balance);
this.overdraftProtection=protect;
    }
/*** 此方法必须执行下列检查。如 果当前余额足够弥补取款 amount,则正常进行。* 如果不够弥补但是存在透支保护,则尝试用 overdraftProtection 得值来弥补该差值(balance-amount).* 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败,但余额未受影响。* @param amt   提款数目* @return  返回true代表交易成功,否则交易失败*/@Overridepublicvoidwithdraw(doubleamt) throwsOverdraftException {
if (balance<amt){
if(overdraftProtection==0){
thrownewOverdraftException("no overdraft protection",amt-balance);
            }
if (amt-balance>overdraftProtection) {
thrownewOverdraftException("Insufficient funds for overdraft protection",amt);
            }else {
overdraftProtection-=amt-balance;
balance=0;
            }
        }else {
balance-=amt;
        }
    }
}

【SavingsAccount.java】类

packagebanking;
publicclassSavingsAccountextendsAccount{
privatedoubleinterestRate;
publicSavingsAccount(doublebalance, doubleinterest_Rate) {
super(balance);
this.interestRate=interest_Rate;
    }
}

【CustomerReport.java】类

packagebanking.reports;
importbanking.Account;
importbanking.Bank;
importbanking.Customer;
importbanking.SavingsAccount;
importjava.util.Iterator;
publicclassCustomerReport {
/*** 使用 Iterator 实现对客户的迭代生成客户报告,Generate a report*/publicvoidgenerateReport(){
Bankbank=Bank.getBank();
System.out.println("\t\t\tCUSTOMERS REPORT");
System.out.println("\t\t\t================");
Iterator<Customer>customers=bank.getCustomers();
while(customers.hasNext()){
Customercustomer=customers.next();
System.out.println();
System.out.println("Customer: "+customer.getLastName() +", "+customer.getFirstName());
Iterator<Account>customerAccounts=customer.getAccounts();
while (customerAccounts.hasNext()){
Accountaccount=customerAccounts.next();
Stringaccount_type="";
// Determine the account type/*** Step 1:**** Use the instanceof operator to test what type of account**** we have and set account_type to an appropriate value, such**** as "Savings Account" or "Checking Account".***/if (accountinstanceofSavingsAccount) {
account_type="Savings Account";
                } else {
account_type="Checking Account";
                }
// Print the current balance of the account/*** Step 2:**** Print out the type of account and the balance.**** Feel free to use the currency_format formatter**** to generate a "currency string" for the balance.***/System.out.println("\t"+account_type+": current balance is ¥"+account.getBalance());
            }
        }
    }
}

【OverdraftException.java】类

packagebanking.domain;
/*** 自定义异常类*/publicclassOverdraftExceptionextendsException{
privatedoubledeficit;
publicOverdraftException(Stringmessage, doubledeficit) {
super(message);
this.deficit=deficit;
    }
publicdoublegetDeficit() {
returndeficit;
    }
}

【TestBanking.java】类

packagebanking;/** This class creates the program to test the banking classes.* It creates a set of customers, with a few accounts each,* and generates a report of current account balances.*/importbanking.domain.*;
importbanking.reports.CustomerReport;
publicclassTestBanking {
publicstaticvoidmain(String[] args) {
Bankbank=Bank.getBank();
Customercustomer;
CustomerReportreport=newCustomerReport();
// Create several customers and their accountsbank.addCustomer("Jane", "Simms");
customer=bank.getCustomer(0);
customer.addAccount(newSavingsAccount(500.00, 0.05));
customer.addAccount(newCheckingAccount(200.00, 400.00));
bank.addCustomer("Owen", "Bryant");
customer=bank.getCustomer(1);
customer.addAccount(newCheckingAccount(200.00));
bank.addCustomer("Tim", "Soley");
customer=bank.getCustomer(2);
customer.addAccount(newSavingsAccount(1500.00, 0.05));
customer.addAccount(newCheckingAccount(200.00));
bank.addCustomer("Maria", "Soley");
customer=bank.getCustomer(3);
// Maria and Tim have a shared checking accountcustomer.addAccount(bank.getCustomer(2).getAccount(1));
customer.addAccount(newSavingsAccount(150.00, 0.05));
// Generate a reportreport.generateReport();
    }
}




目录
相关文章
|
13天前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
205 1
|
16天前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
125 3
|
17天前
|
缓存 前端开发 Java
基于最新 Java 技术栈的在线任务管理系统开发实战详解
本项目基于最新Java技术栈开发在线任务管理系统,涵盖任务创建、分配、跟踪、统计等功能。采用Spring Boot 3.2.x、React 18、PostgreSQL 16等主流技术,详解项目架构设计、核心功能实现及部署流程,助力掌握现代Java全栈开发技能。
96 6
|
15天前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
178 1
|
1月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
111 7
|
22天前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
205 0
|
1月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
230 63
|
29天前
|
监控 Kubernetes Java
最新技术栈驱动的 Java 绿色计算与性能优化实操指南涵盖内存优化与能效提升实战技巧
本文介绍了基于Java 24+技术栈的绿色计算与性能优化实操指南。主要内容包括:1)JVM调优,如分代ZGC配置和结构化并发优化;2)代码级优化,包括向量API加速数据处理和零拷贝I/O;3)容器化环境优化,如K8s资源匹配和节能模式配置;4)监控分析工具使用。通过实践表明,这些优化能显著提升性能(响应时间降低40-60%)同时降低资源消耗(内存减少30-50%,CPU降低20-40%)和能耗(服务器功耗减少15-35%)。建议采用渐进式优化策略。
88 1
|
27天前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
139 0

热门文章

最新文章