题目:就诊模拟排队叫号
题意:
1、实验要求 本实验要求:以医院排队叫号就诊为业务背景,训练Java列表对象(List)的应用场景。 1-1. 业务说明: 1-1.1. 本实验以患者到医院就诊为业务背景,患者取号排队,等待叫号。 1-1.2. 叫号器负责叫号,叫号后移除排队的队首患者,并显示其他候诊人。 1-2. 创建工程并配置环境: 1-2.1. 限制1. 创建实验工程,命名为:SE_JAVA_EXP_E039; 1-2.1. 限制2. 创建包,命名为:cn.campsg.java.experiment; 1-3. 创建排队叫号器业务类: 1-3.1. 限制1. 在cn.campsg.java.experiment.包中创建排队叫号器业务类: 1) 类名:QueueCaller。 1-3.2. 为QueueCaller类创建私有属性,要求如下: 属性权限 属性名称 属性类型 属性说明 private queue 无 ArrayList<String> 患者排队列表 泛型说明:队列中存储的是患者姓名(字符串类型)。 1-3.3. 为QueueCaller类创建0参构造器: 1) 在构造器内实例化患者排队列表(queue)。 1-3.4. 为QueueCaller类创建获取患者数量的方法,要求如下: 访问权限 方法名称 返回值 方法参数 参数说明 public size int 无 无 方法说明:本方法获得当前正在排队候诊的患者数量。 1-3.5. size方法的业务逻辑实现要求如下: 1) 从排队队列queue中获取有效长度。 1-3.6. 为QueueCaller类创建取号的方法,要求如下: 访问权限 方法名称 返回值 方法参数 参数说明 public fetchNumber void String patient 取号的患者 方法说明:本方法将就诊患者加入到排队队列(queue)中。 1-3.7. fetchNumber方法的业务逻辑实现要求如下: 1) 将就诊患者加入到排队队列(queue)中; 2) 输出患者排队就诊信息,信息如下: 患者姓名 + "前面还有 " + 排队人数+ " 位在等候就诊。" 1-3.8. 为QueueCaller类创建显示候诊患者信息的方法,要求如下: 访问权限 方法名称 返回值 方法参数 参数说明 public showPatients void 无 无 方法说明:本方法显示所有正在排队的患者姓名。 1-3.9. showPatients方法的业务逻辑实现要求如下: 1) 获取排队的所有患者姓名; 2) 输出每位患者的姓名,信息内容: 患者姓名 + " 候诊中"。 1-3.10. 为QueueCaller类创建叫号方法,要求如下: 访问权限 方法名称 返回值 方法参数 参数说明 public callNumber void 无 无 方法说明:按照取号顺序依次叫号。 1-3.11. callNumber方法的业务逻辑实现要求如下: 1) 从排队队列(queue)中返回队首患者姓名; 2) 移除队首患者(表示该患者已经就诊不在排队队列中)。 3) 输出被叫号的患者信息,信息内容: "请患者:" + 患者姓名 + " 到诊室就诊!"。 1-4. 显示模拟叫号就诊情况: 1-4.1. 限制1. 在cn.campsg.java.experiment包中创建主类:MainClass; 1-4.2. 为MainClass创建入口主方法:main。 1-4.3. 模拟3个患者排队就诊: 1) 在main方法中,创建1个排队叫号器(QueueCaller)对象; 2) 在main方法中,向叫号器对象存入3个患者姓名; 1-4.4. 模拟叫号: 1) 在main方法中,循环叫号直到没有就诊患者为止。 2) 每次叫号后均需显示正在排队的患者信息。
代码:
`分为一个包两个类 QueueCaller.java package cn.campsg.java.experiment; import java.util.*; public class QueueCaller { private ArrayList<String> queue; public QueueCaller(){ //构造函数里创建实例 queue=new ArrayList<String>(); } //获取容器中现有数量 public int size(){ return queue.size(); } //向容器添加String类型的,此时第一个为就诊的,后面为等待就诊的 public void fetchNumber(String patient){ queue.add(patient); System.out.println(patient+"前面还有"+(size()-1)+"位在等候就诊"); } //这里是查看候诊中的 public void showPatients(){ if(queue.size()<=1){ return; } else{ for(int i=1;i<=queue.size()-1;i++) System.out.println(queue.get(i)+"候诊中"); } } //进行叫号,移除正在就诊的,然后进行呼叫下一个 public void callNumber(){ queue.remove(0); if(queue.size()!=0) System.out.println("请患者:"+queue.get(0)+"到诊室就诊!"); } }
注意点:
1.在Arrylist容器中移除一个时,这个位置之后的下标都会往前移一格,同时,统计数量的size()也会自动减少一个的,Arrylist就像是数组
2.这道题中callNumber里在移除一个之后,应当判断是否在容器中还存在,如果不判断例如容器中只剩最后一个移除掉,那么此时容器无内容,此时再通过下标访问那么就出超界。
接在来是MainClass类中:
package cn.campsg.java.experiment; public class MainClass { public static void main(String[] args){ //创建对象 QueueCaller qc= new QueueCaller(); //进行插入数据 for(int i=1;i<=3;i++){ qc.fetchNumber("张三-"+i); } //不断进行叫号并且进行查看等候就诊的人数 while(qc.size()!=0){ qc.callNumber(); qc.showPatients(); } } }