面向对象的编程-Application 42

Previously on OOP:

We have created several objects of type Contact in Phonebook class. Then, stored all objects of type Contact into an array. Finally, the array was defined as an attribute in Phonebook class.

果然不出本黄鸭所料,果然Phonebook类不可能只负责创建Contact类的实例,还要负责增删改查,以及数据处理。所以,一般主的类中都有至少一个数组或者Java generics,用于存放其他类的objects。

这个需求要取出被创建的第一个Contact的实例,也就是contacts数组的第零号元素。另外,还要把这个objects转化成为一个String。

用contact[0]可以取出contacts数组的第零号位置中存放的object reference。这个object reference指向的object的类型是Contact类的,所以能用它和dotted notation调用Contact类中的函数。

把Contact类型的object reference转化为String有以下两种方法:

(1)如本段代码中的comments所示,直接用object reference调用各种getters,然后用“+”把不同的子字符串首尾相连写成一个字符串。

(2)用object reference调用Contact类中的asString()函数,这个函数能把Contact类的attributes整理成为一个字符串。asString()的代码如下所示:

刚才是取出contacts数组的第零号元素,现在要求取出指定位置的元素。那么,我们只要把contacts[0]中,数组的下标改成其他数字,就能取出指定位置的Contact类型的object reference。再用该object reference调用asString()函数,生成作为返回值的String。

之所以需要把传入参数的值减去1作为数组的下标,是因为数组的下标是从开始的。

另外,如果传入的参数“i”超过了99,即超出了数组下标的最大值,就会产生编译错误。如果“i-1”的位置没有存放Contact的object reference,那么就没有办法调用asString()函数,从而产生run time Exception。为了避免这两种情况,我们可以再加一段if防御性代码,先判定一下“i-1”是不是小于contacts.length -1 / next -1 /数组中存放元素的个数,如果是,才能写contacts[i-1]。

这个需求要把整个contacts数组转化为一个字符串。先用循环结构,把每个Contact转化为字符串。然后把这些字符串连接在一起,中间用逗号分割。最后在前面和后面接上一组大括号。

Solution 1

循环结构采用的是for循环,从第零号元素遍历到contacts.length-1。其中,contacts.length是数组类的一个attributes,存放的是数组中从第零号元素到最后一个非空元素的个数。本黄鸭非常推荐把for循环的终止条件写成“index

除了要判断contacts[index]是不是空指针、能不能调用asString()函数之外,还要看“index>0”,因为零号元素的前面不需要逗号分隔符。

Solution 2

把for循环改成了for each statement。为了保证第一个字符串前面没有逗号分隔符,这里还采用了first标志位。当第一次进入循环体的时候,first标志位的值是true,所以不会concatenate逗号分隔符,而是会把这个标志位设为false。在下一次进入循环体时,会加上逗号分隔符。

Solution 3

本黄鸭曾经说过,StringBuffer的append()函数比String的concatenation效率要高。而刚才的两个例子使用的都是String concatenation,现在我们使用StringBuffer来做。需要注意的是,toString()函数的返回值是String类型的,而且StringBuffer不能被编译器自动转化为String类型的,必须要调用StringBuffer类的toString()函数才行。

找到第一个含有给定字符串的Contact,给定的字符串可能是名字,姓氏,或者电话号码。要实现这个需求,我们还是要使用循环结构,遍历contacts数组,一个一个Contact找。针对于每个Contact,要依次把名字,姓氏,和电话号码和给定字符串比较。

给定字符串的名字叫做needle。对于每个Contact,调用Contact类的contains()函数,把给定字符串作为参数传递过去,看看这个字符串是不是和三个attributes中的一个相同。如果相同,那么就把这个Contact转化为字符串,作为返回值返回。如果直到遍历完了contacts数组中的所有元素都没有找到,那么结论就是没有找到,返回“NotFound!”字符串。

把给定字符串分别和firstName、lastName和phoneNumber比较,如果有任意一个相同,返回值就是true。

以上就是第一个大作业Phonebook project的所有内容啦~

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

微信公众号二维码:

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

扫码关注云+社区

领取腾讯云代金券