学习笔记10从零开始学java-第十一章课后习题

学习笔记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,代码多有不足,如有错误,非常感谢你的指正。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值