面向对象的编程-Application 56

Previously on OOP:

If no person/ doctor matches the given SSN/ badge ID, an self-defined Exception will be thrown. Then the Exception will propagate along the hierarchy of function invocation, till the main function. If main function does not have a handler, the program execution will be terminated.

当病人在门诊挂号的时候,不仅信息会被记录到系统中,而且还会为他们指定看病的医生。第一步是分别用SSN和badge ID把病人和医生的object references找出来;如果“查无此人”,就扔出Exception。也就是是调用前面需求中编写的getPatient() andgetDoctor()函数,把object references取出来。

刚才我们调用的getPatient() andgetDoctor()函数是在Clinic类中的,本段需求表示,在PersonandDoctor类中也有getPatient() andgetDoctor()函数。所以,assignPatientToDoctor()函数的第二步是把Patient加入到Doctor中,而且把Doctor加入到Patient中。

那么,问题又来了,病人和医应该存放在怎样的数据结构中呢?也就是在问,病人和医生在数量上有什么关系呢?一个病人应该只有一个医生,而一个医生一天应该要给好多病人看病。所以,在Patient类中,只要有一个Doctor类型的attribute来存放医生信息就够了;在Doctor类中,需要有一个静态数组/ Java Generics来存放病人。

数据结构可以选用Map/ Set,因为病人的SSN是唯一的,但是本黄鸭觉得生活需要变化,决定使用LinkedList。

Person类中的setDoctor()函数负责把医生加入到病人信息中去;Doctor类中的addPatient()函数负责把病人加入到医生的信息中去。

为了避免同一个病人被多次加入到Doctor类的list of patients中,我们先调用removeMe()函数,把这个病人从list of patients中删除;然后再加入到list中。当然,如果数据结构选用Map/ Set就不会遇到这样的问题。

loadData()函数的功能是读取文件,文件来源于参数中接收到的file path,文件的内容是病人和医生的信息。每行文件有可能是病人信息,也有可能是医生信息。

如果某行文件的第一个字母是“P”,那么这行是病人信息,后面是名字,姓氏和SSN三个字段;如果第一个字母是“M”,那么这行是医生信息,后面是五个字段。行与行之间用分号间隔。

如果某行信息有问题,那么我们就忽略这一行,继续往下读取文件。如果是有IO问题,那么就扔出一个IOException,并且沿着hierarchy of invocation往main函数传递。

在第二层try-catch block中的代码不难理解,就是根据每行的首字母排定是医生信息还是病人信息,然后创建对应的实例。如果首字母既不是“P”,也不是“M”,那么说明这一行数据有问题,我们忽略它,继续读下一行文件。

Catch block有两个,一个是ArrayIndexOutOfBoundsException,另外一个是NumberFormatException。我们也可以简单粗暴地就写一个catch block类型是Exception,因为题目中没有明确是那种Exception。

而第一层try-catch block的代码理解起来就相对困难了,实在无法坚持的宝宝们只要会套用就行了。第一步,创建BufferedReader的实例,把文件打开。然后用regular expression,把文件按照分号分割成一行一行的信息。接着就创建了一个临时变量叫做items,依次指向每行文件,怎样处理都写在了Lambda expression中。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

你的每一个“好看”,都是对我的鼓励

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190109G1C42400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券