Blog作业2
第二次Blog作业
20201232 张兆奇
1、前言
本次题目集主要是对类的封装,聚合,继承,多态和接口的考察,其中再7-5中还对ArrayList的使用进行了考察,其中还包括对泛化、Arrray和collections的简单应用,本阶段题目集还设置一些有关正则表达式的基础训练,相对较简单,比较基础,但对正则的使用和熟悉有一定的帮助。题量相对上阶段减少,题目难度逐渐降低,7-4偏难,7-6较容易,总体来看,相较上阶段作业,难度有所提高。
2、设计与分析
(1)题目集4(7-2)和题目集5(7-5)日期聚合类的比较
题目集4和题目集5都有一道关于日期类的聚合,运行虽然一样,但主要的聚合方式有主要的区别是对年月日的聚合有不同的方法。本类题主要是输入相应的日期和需要进行的功能,其中包括实现日期下N天的计算、日期前N天的计算和两个日期相差天数的计算,主要运行过程就是将年月日分别设置一个类,并设计一个名为“DateUtil”的主要功能运行类,要求对年月日之间实现聚合的使用。
题目集4主要是让年月日分别生成,并在最后的主要运行类中在进行相应的应用,这种聚合的方法更容易让人理解,并且显得聚合的更加紧密,而且使得在主要运行的函数中即不缺少相应的年月日的对象,又使得其较为简便。但这种聚合编写起来比较复杂,而且在出错后不容易修改,对机器相较而言,这种方法容易运行超时。
题目集5主要是让年月日一起生成,这种聚合又叫组合,相当于年月日是三个分别独立的三个小类,在主要进行功能的类里对其进行统一的引用,这种组合相较与聚合一编写较为简单,对年月日的引用也相较统一,相较机器而言,也更好理解,而且这种组合在调试时更加直观。但这中组合容易在主要功能运行的类里遗漏常量,而且编写内容相对较多。
题目集4(7-2)报表如下:

题目集5(7-5)报表如下:

题目集4(7-2)类图如下:

题目集5(7-5)类图如下:

(2)题目集4(7-3)、题目集6(7-5、7-6)图形设计
三个题目集的图形继承虽然运行结果相同,但它们分别运用不同的方法进行实现,其中包括封装,继承,多态,接口等,其中每一道都用到了类的封装。本题主要是计算所给土星的面积和体积,设计相应的小类,再在主要进行运行的主类里用“switch”进行功能的选择。
题目集4(7-3)主要运用继承,设计一个“shape”类,在其中加入相关的输出内容,其中包括进行面积运算的函数。在小类中,在无参构造函数中输出是那种图形,并用setter和getter进行调用和赋值,主类主要是对数据的筛选和对小类中的函数进行引用。这种继承的方法,避免了因为各个小类中有相同名字的函数而出错。
题目集6的7-5主要是运用类的继承和多态性,其中用到了抽象类的方法。本题向比较一题目集4的,将立体图形删去,并将“shape”类设计为抽象类,又在类中使用抽象方法设计了“getArea()”、“validate()”和“toString()”的函数,分别进行面积的计算、范围测试和图像信息的表达。在小类中通过继承和覆写对抽象类中的函数进行应用。在此题中还有对泛化、Arrray和collections的简单应用,在主类用collections进行面积的排序。这种方法更加有效,使得运行时避免出现超时的问题。
题目集6的7-6主要是运用了接口的功能,这种方法代替了继承的方法,还是在“shape”类中编写了抽象的“getArea()”函数,主要的功能和7-5相同,只是在7-5的基础上减少了对泛化、Arrray和collections的简单应用,输出和输入相对变得简单。
题目集4(7-3)报表如下:

题目集6(7-5)报表如下:

题目集6(7-6)报表如下:

题目集4(7-3)类图如下:

题目集6(7-5)类图如下:

题目集6(7-6)类图如下:

(3)正则表达式的技术分析
本阶段用到正则的有题目集4的7-1和题目集6的前四道题目,主要是对正则表式的语句和选择的基础训练,题目集6的四道题相对简单,主要是考察对正则语句的基础表达,而题目集4式水文地处理,主要还是对正则表达式的选择和输入输出进行较复杂的考察。
题目集6考察的正则主要是对一些字符的正则表达和对正则中“match”的应用,第一道题是关于数字的校验,其中考察了对特殊位置(例如首位)和数字的范围。第二道题主要是正则中的字符排序的考察,这道题是先利用正则中的函数“toCharArray()”将输入的转化为数组,再利用数字的排序函数“Arrays.sort()”对其进行排序。第三道题主要是对包含数字和字母的号码验证,并且对字符的大小写的字符表示进行了考察。第四道题主要考察对都学号的校验,主要考察对正则的特殊位置的书写,以及相同数字的书写,学号的前思位是相同的,有些位置是固定的,我没有找到比较好的方法,就只是挨个输入、筛选。
题目集4的7-1是关于使用正则的水文处理,简单来说,就是对南水北调的数据记录,包括目标水位、实际水位、开度和流量。在输入过程中需要运用正则对数据进行转换,在输入数据时,还需要输入时间,最以“exit”结束。这道题主要是对正则的字符表达和选择进行考察。
题目集4(7-1)类图如下:

(4)题目集5(7-4)查找关键字分析
题目集5的7-4主要是对关键字的提取,首先java中的关健字存在数组中,并用“StringBuilder”设置一个变量ss,其中在查找的过程中还运用了正则表达式,对输入的一串字符进行查找,找出其中需要的关键字。其中,用到了“Map”、“Pattern”、“match”、“append”和“equals”等函数和接口。题目中还要求对找出的关键字进行相应的排序,所以需要将找到的关键字存入数组,再用“Arrays.sort”进行排序。中间还用到了“toString”,因为其自带中括号,因此又对其进行了一系列的替换掉中括号和空格的操作。
题目集4(7-5)报表如下:

3、踩坑心得
(1)日期聚合类
题目集4的7-2在一开始看到类图时,对函数的概念不清,导致一开始的带参构造函数设计地有问题,导致运行出错,之后的聚合又出问题,对聚合的不完全理解导致聚合的写法有误,未在无参构造函数添加聚合相应的内容,导致无法运行,在主要运行的类中,主要出问题的是对前面聚合的使用,和对时间平年闰年的判断,天数因为有年份的不同而不同,但我在一开始时,经常忽略这个问题,不是少加就是忘记了判断,对范围和时间考虑不周,对特殊日期(例如:平年二月)的判断考虑不到,导致在最后范围报错。在书写函数的主要运行过程时不会简便书写,对前面写过的小类不会进行引用,导致步骤繁琐。
题目集5的7-5的年月日的类相对来说,没有题目集4的复杂,主要的问题都是出在主要运行的类中,因为聚合二是直接在最后进行对象的生成,相对来说,比聚合一要简单,但我在一开始把事情复杂化了,导致运行的函数无法成功,甚至出现了运行超时的错误。最后,我将函数换了个形式求相应的结果才成功。
(2)图形继承类
题目集4的7-3类和继承都是基础的考察,比较简单,主要出错的地方还是对立体图形的面积公式不熟悉,还有一些输出的小细节,因为是第一次写继承,再写小类是经常忘记写“extends”,在判断范围时,经常忘记在错误的输出语句后加上代表结束的语句,导致输出错误。
题目集6的7-6图形设计主要时关于平面图形的设计,这道题涉及到了有关接口的知识,一开始在了解完接口的内容后,动手写的时候,忘记了在接口中的函数需要抽象类,导致出错,接口的连接词为“implements”我因为粗心,多次将其写为“extends”,导致无法运行。
题目集6的7-5图形设计较为复杂,主要运用了类的多种功能,前面对于抽象类的运用很简单,主要的问题出现在主要运行的类中,本次是对泛化、Arrray和collections的简单应用,一开始不熟悉时,用了相应泛化类型的“get”功能,但一直出错,最后将其改为“add”成功运行,之后的输出老是写不好,过于复杂繁琐,导致输出没有答案,最后我通过学习,学会了“for(double i:)”的用法,很好的解决了这个问题。
(3)正则表达式
这次对正则的考察比较基于基础,基本都是对正则的写法的考察,一开始对特殊位置的正则表达不太好,不能完整对题目的要求进行筛选。
(4)关键字的查找
关键字的函数和技巧很多,在一开始,我只是想单纯的运用简单的if语句进行筛选,但我越到后面越发现这么写不仅复杂,而且也无法很好的运行,因此,我在网上寻找了相关的函数,对函数的使用进行了一系列的琢磨,最后成功的运行成功。
4、改进建议
本次的题目主要数考察类的继承、多态、封装和接口,大多数的题目都是面对这些类的功能进行考察,基本上都是一道题的多种方法 ,但题目会分两个题目集,我觉得多种写法的同一到题目可以出在一个题目集里,这样进行对比学习比较方便。另一方面就是关于代码的书写,对于一些重要的知识点,其实可以有一个不断进阶的编写,加深对重要的知识的理解和熟练。
5、总结
本次主要是对一些类的相关功能和性能的考察,这种同一道题目的不同写法的方法,让我学会了比较学习的方法,用类图进行编程对我读图能力有一定的提升,对正则的基础训练让我终于不在害怕正则,也学到了许多关于正则表达的方法,本阶段的作业让我的自学能力和自主编程能力又有了进一步的提升。

浙公网安备 33010602011771号