学习笔记10-第十一章 集合类
用书参考:孙连英,刘畅,彭涛所著的Java面向对象程序设计。
我的所有代码你都可以通过GitHub获取,
以下为我的GitHub地址:[https://github.com/MrNeoJeep/java-code.git](https://github.com/MrNeoJeep/java-code.git%5C)
本章共有两道习题
(1)在第五章中介绍了BankAccount类,以及存储银行账户的聚集类Bank。Bank类可以使用数组实现
题目介绍
在第五章中介绍了BankAccount类,以及存储银行账户的聚集类Bank。
Bank类可以使用数组实现
①、Java中哪种集合类更适合代替数组实现Bank类?(个人觉得是ArrayList类)
②、修改BankAccout类,使该类适用于问题①确定的解决方案。
③、重写Bank类,使用集合类而不是数组实现。
④、编写测试程序
代码
import java.util.*;
public class Text11_1 {
public static void main(String[] args) {
/* 在第五章中介绍了BankAccount类,以及存储银行账户的聚集类Bank。
* Bank类可以使用数组实现
* ①、Java中哪种集合类更适合代替数组实现Bank类?(个人觉得是ArrayList类)
* ②、修改BankAccout类,使该类适用于问题①确定的解决方案。
* ③、重写Bank类,使用集合类而不是数组实现。
* ④、编写测试程序
* */
Test test1 = new Test();
test1.test();
}
}
//编写测试类
class Test
{
public void test() {
Bank bank = new Bank();
BankAccount b1 = new BankAccount("A1", "Tom");
BankAccount b2 = new BankAccount("A2", "Tim");
BankAccount b3 = new BankAccount("A3", "Jerry");
bank.add(b1);
bank.add(b2);
bank.add(b3);
//bank.testAdd();
System.out.println("总数为:" + bank.getTotal());
System.out.println("第一位用户编号为:" + bank.getItem("b1").getAccountNumber());
System.out.println("第一位用户姓名为:" + bank.getItem("b1").getAccountName());
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
//存钱
boolean flag = bank.depositMoney("A2", 10000);
System.out.println("A2用户存钱是否成功,true成功,false失败 " + flag);
//取钱
boolean flag2 = bank.withdrawMoney("A2", 1000);
System.out.println("A2用户取钱是否成功,true成功,false失败 " + flag2);
//移除用户
boolean flag3 = bank.remove("A3");
System.out.println("A3用户是否删除成功,true成功,false失败 " + flag3);
}
}
//Bank类
class Bank
{
private List<BankAccount> ls;//定义ArrayList的集合类,数据类型为BankAccount
private int total;
//考虑到数组是可以动态拓展的,可以不传入size
public Bank()
{
ls = new ArrayList<BankAccount>();
this.total = 0;
}
//接收一个表示账户编号的字符串参数,返回输入编号对应的账户数组下标
public int search(String accountNumberIn)
{
//遍历
Iterator<BankAccount> it = ls.iterator();
int index = -1;
while(it.hasNext())
{
index++;
if(it.next().getAccountNumber() == accountNumberIn);
{
return index; //如果满足条件会提前return掉,不会return-999;
}
}
return -999;
}
//getTotal函数
public int getTotal()
{
return this.total;
}
//add函数的实现 添加函数是正确的
public boolean add(BankAccount accountIn)
{
ls.add(accountIn);
total++;
return true;
}
// public void testAdd()
// {
// Iterator<BankAccount> it = ls.iterator();
// while(it.hasNext())
// {
// System.out.println(it.next().getAccountNumber());
// }
//
// }
//getItem函数的实现,要求接收一个代表账户编号的字符串参数,返回账户编号BankAccount对象、
public BankAccount getItem(String accountNumberIn)
{
int index;
index = search(accountNumberIn);
if(index == -999)
{
return null;
}
else {
return ls.get(index);
}
}
//编写depositMoney,第一个参数为账户编号,第二个参数为存款额。如果存款成功则返回true否则返回false
public boolean depositMoney(String accountNumberIn,double accountIn)
{
int index = search(accountNumberIn);
if(index == -999)
{
return false;
}
else {
ls.get(index).desposit(accountIn);
return true;
}
}
//withdrawMoney
public boolean withdrawMoney(String accountNumberIn,double amountIn)
{
int index = search(accountNumberIn);
if(index == -999)
{
return false;
}
else {
ls.get(index).withdraw(amountIn);;
return true;
}
}
//remove函数
public boolean remove(String accountNumberIn)
{
int index = search(accountNumberIn);
if(index == -999)
{
return false;
}
else {
ls.remove(index);
return true;
}
}
}
//BankAccount类
class BankAccount
{
private String accountNumber;
private String accountName;
private double balance;
private static double interestRate;
public BankAccount(String numberIn,String nameIn)
{
this.accountNumber = numberIn;
this.accountName = nameIn;
this.balance = 0;
}
public static double getInterestRate() {
return interestRate;
}
public static void setInterestRate(double interestRate) {
BankAccount.interestRate = interestRate;
}
public String getAccountNumber() {
return accountNumber;
}
public String getAccountName() {
return accountName;
}
public double getBalance() {
return balance;
}
//存钱
public void desposit(double amountIn)
{
balance = balance+amountIn;
}
//取钱
public void withdraw(double amountIn)
{
balance = balance-amountIn;
}
}
运行结果
(2)以医院排队叫号就诊为业务背景,训练Java列表对象(List)的应用场景
题目介绍
以医院排队叫号就诊为业务背景,训练Java列表对象(List)的应用场景。患者取号排队,等待叫号。叫号器负责叫号,叫号后移除排队的队首患者,并显示其他候诊人。
创建排队叫号器业务类(QueueCaller),私有属性有患者排队列表(ArrayListqueue);
方法有:
①、无参构造方法。构造方法内实例化患者排队列表(Queue)
②、获取患者数量的方法int size()。该方法的功能是从排队队列queue中获取有效长度、
③、取号的方法void fetchNumber(String patientName)。本方法将就诊患者加入到排队的队列中并输出患者的就诊信息,信息内容:
患者姓名+“前面还有”+排队人数+“位在等待就诊。”
④、显示候诊患者信息的方法 void showPatients()。该方法获取排队的所有患者的姓名;
并输出每位患者的姓名,信息内容
患者姓名+“候诊中”
⑤、叫号方法void callNumber()。该方法的功能是从排队队列中返回队首患者的姓名;
移除队首患者(表示患者已经就诊,不在排队队列中);输出被叫号的患者的信息,信息内容
“请患者:”+患者姓名+“到就诊室就诊!”创建主类(MainClass)模拟叫号情况。创建main方法,在方法内完成以下任务:创建一个排队叫号器的对象 向叫号器对象存入三个患者的姓名;循环叫号到没有患者为止;每次叫号均需显示正在排队的患者信息
代码
import java.util.*;
public class Text11_2 {
public static void main(String[] args) {
/*以医院排队叫号就诊为业务背景,训练Java列表对象(List)的应用场景。患者取号排队
* ,等待叫号。叫号器负责叫号,叫号后移除排队的队首患者,并显示其他候诊人。
* 创建排队叫号器业务类(QueueCaller),私有属性有患者排队列表(ArrayList<String>queue);
* 方法有:
* ①、无参构造方法。构造方法内实例化患者排队列表(Queue)
* ②、获取患者数量的方法int size()。该方法的功能是从排队队列queue中获取有效长度、
* ③、取号的方法void fetchNumber(String patientName)。本方法将就诊患者加入到排队的队列中
* 并输出患者的就诊信息,信息内容:
* 患者姓名+“前面还有”+排队人数+“位在等待就诊。”
* ④、显示候诊患者信息的方法 void showPatients()。该方法获取排队的所有患者的姓名;
* 并输出每位患者的姓名,信息内容
* 患者姓名+“候诊中”
* ⑤、叫号方法void callNumber()。该方法的功能是从排队队列中返回队首患者的姓名;
* 移除队首患者(表示患者已经就诊,不在排队队列中);输出被叫号的患者的信息,信息内容
* “请患者:”+患者姓名+“到就诊室就诊!”
*
* 创建主类(MainClass)模拟叫号情况。创建main方法,在方法内完成以下任务:创建一个排队叫号器的对象
* 向叫号器对象存入三个患者的姓名;循环叫号到没有患者为止;每次叫号均需显示正在排队的患者信息
*
*
*/
MainClass test = new MainClass();
test.main();
}
}
class MainClass extends QueueCaller
{
public void main()
{
QueueCaller caller = new QueueCaller();
caller.fetchNumber("张三");
caller.fetchNumber("李四");
caller.fetchNumber("王五");
//不能用queue.size,因为size是在动态变化的。
for(int i = 0; i < 3;i++)
{
caller.callNumber();
caller.showPatients();
System.out.println("~~~~~~~~~~~~~~");
}
}
}
//编写叫号器业务类QueueCaller
class QueueCaller
{
protected List<String> queue;//排队的队列数组
public QueueCaller()
{
queue = new ArrayList<String>();
}
//获取队列的长度
public int getSize()
{
return queue.size();
}
//取号
public void fetchNumber(String patientName)
{
int num = getSize();
queue.add(patientName);
System.out.println(patientName + "前面还有" + num + "位在等待就诊。");
}
//显示患者信息
public void showPatients()
{
Iterator<String> it = queue.iterator();
while(it.hasNext())
{
System.out.println(it.next()+"候诊中。");
}
}
//叫号方法
public void callNumber()
{
System.out.println("请患者:" + queue.get(0) + "到就诊室就诊。");
queue.remove(0);
}
}
运行结果
初学java,代码多有不足,如有错误,非常感谢你的指正。