题目集4~6的总结性Blog
4-6次题目集总结
一、 前言
在这三次题目集中,第4次题目集题量较少、第5次和第6次题目集题量比较大,但是第4次题目集中的题目较之第5次、第6次题目集的题目难度要更大。这三次题目集所涉及的知识较之前三次题目集与java语言关系更加深,所以难度也要比前三次更难。在这三次题目集中涉及到的知识内容有正则表达式、类的定义与引用、类的继承、接口、字符串的操作、arraylist的应用等。
二、 设计与分析
- 第四次题目集7-1题水文数据校验及处理,该题目需要对输入的每行数据分别进行有效性校验,若遇到不符合规则的数据,系统要能够给出具体某行某列的错误提示,若数据无误时要根据题目要求输出相应信息。在写这道题目时对输入数据的存储方面使用了集合的方法,之后对每行数据在“|”字符处进行了字符串切割,之后使用了正则表达式来判断每个数据是否符合规则,在测试点上,第八、九、十个测试点不知道时哪里错了。该题目的代码分析如下图,在编写该题目时,由于使用了较多的if判断语句以及for循环语句,所以导致了平均复杂度、最大复杂度、平均深度、平均语句数较高,这题在仅方法上写了一个判断输入年份是否为闰年,所以在方法和类这一数据上偏低。
- 第四次题目集7-3图形继承,该题目是实现图形类的继承,主要是练习类的继承的使用,其中需要使用到对父类方法重写,这道题目编写代码时除了过程略有繁琐之外,其它都还行,根据代码所画类图如下:
在编写代码时,几乎没有怎么对代码内容注释,导致类图分析中注释比例很低,又对语句的使用在该题中使用的也没有很多,仅使用了一个switch语句和几次if判断语句,因此平均复杂度也不高。代码生成相应分析图如下:
- 第五次题目集7-4统计java程序中关键词出现次数,该题目是统计一个输入的java源代码中关键字(区分大小写)出现的次数。对于该题目的实现,首先使用了arraylist集合来存储输入的每行java源代码,之后通过字符串的替换,将输入的源代码中两种注释的内容都删除掉,最后通过正则表达式来匹配每个单词并且判断是否为关键字来进行统计。下图为代码分析图,由于在编写代码时使用了较多的if和for语句从而导致了分析图中平均复杂度、最大复杂度偏高,而由于使用了多层嵌套语句使平均深度、最大深度等偏高,虽然在编写代码时对代码进行了一定的注释,但是从这分析图来看,显然对代码的注释还是偏少。
- 第四次题目集7-2和第五次题目集7-4两种日期类聚合设计的比较:日期聚合(一)中在设计Day、Year、Month、DateUtil等类的时候,Month的成员变量中含有Year类型的变量,Day中含有Month类型的成员变量,DateUtil类中含有Day类型的成员变量;而在日期聚合(二)中,Day类、Month类、Year类之间互不相干,只在DateUtil类含有其它三个类的类型变量,相比较之下,日期类聚合设计(二)的耦合度要更加低,在需要修改Day、Month、Year类其中一项时只需要另外在DateUtil中做出相应修改即可,而在日期类聚合(一)中,若是需要做出修改则其它也包含该类变量的类也要做出修改,相比较于日期类聚合(二)所需要做出的修改要更多,故日期类聚合(二)要更加利于后期代码的修改。此外聚合(二)在DateUtil类中调用Month、Year类中成员变量或者方法也更加简单,聚合(一)比较容易混淆。类图对比如下:
日期类聚合(一)类图:
日期类聚合(二)类图:
从两类图中可以看出,日期类聚合(一)中DateUtil、Day、Month类每个类都和其下面定义的所有类都有关联,而在聚合(二)中Day、Month、Year类都分别只和DataUtil类有关联,它们三个类之间互不相干。
- 第六次题目集7-2对字符串中的字符进行排序,该题目需要对出入的字符串中每一个字符按照ASCII码的大小来进行升序排序并输出。在解决该题目时首先使用了str.toCharArray();的方法将字符串变为字符数组,之后再使用了选择排序法来对该字符数组进行排序。
- 第六次题目集7-5图形的继承与多态,创建若干数量的三角形、矩形、圆形并输入相应的半径,边长等,对得到每个图形的面积再对得到的所有面积进行排序。首先定义一个抽象类Shape之后再分别定义Circle、Triangle、Rectangle类均继承与Shape类,在类中定义所继承的抽象类中的抽象方法,之后在主函数中编写相应的代码,将对面积排序放在Main函数中。代码分析图及类图如下,通过代码分析看出,这道题目所编写的代码各个数据较好,但还需要再多加一点注释。
- 第六次题目集7-6实现图形接口及多态性,创建一个GetArea的接口,里面含有一个求面积的抽象方法,定义一个圆类以及矩形类分别实现GetArea接口,在Main类的主方法中一个圆类对象和矩形类对象,使用接口分别调用圆类对象及矩形类对象的求面积方法,直接输出两个图形面积。该题目要求我们简单的使用了接口这一知识点,对于所编写的代码分析图如下,由于在编写代码的过程中仅仅只在判断输入圆形半径和矩形两条边长是否符合规则的时候使用到了一个if判断语句,在其它地方都没有使用函数语句,故而导致了分析图中平均复杂度和平均每个方法中使用语句数都偏低,尤其是后者基本上为接近零。关于该题目的类图在分析图下方。
- 关于第四次题目集7-3、第六次题目集7-5和7-6三种渐进式图形继承设计的思路与技术运用(封装、多态、继承、接口)的分析:一个类只能继承一个父类,却能拥有多个接口,三种继承都可以增加自己的新功能。在继承中子类可以覆盖被继承的方法和提供这些方法的特定实现,子类可以基于父类的一般元素提供特定的行为。而在继承一个抽象类的时候,对于抽象类中的抽象方法,在子类中必须对其重写,否则程序会报错,所以在使用抽象类的时候,在查看代码的时候会更加注意抽象方法;使用接口,可以减少代码的书写,提高代码的可维护性和扩展性,可以实现多态。
- 对三次题目集中使用到的正则表达式的分析总结:在第四次题目集7-1水文数据校验及处理在该题目中所需要匹配的数据有些多一共使用了四个正则表达式,使用了正则表达式匹配了两种日期,分别为闰年日期和平年日期,匹配目标水位、实际水位、流量,匹配目标开度、实际开度,这四个正则表达式中,比较难写的是有关日期的两个。为了让我们练习正则表达式的书写,在第六次题目集中前几道题目大多都是一些有关于正则表达式的题目,7-1匹配QQ号,这题主要是匹配数字以及控制长度,7-3验证码校验在7-1的基础上还需要匹配字母,7-4学号校验这题较之前两题难度更大。但是总的来说第六次题目集中的正则表达式比起第四次题目集中的正则表达式的书写要更加简单。
- 第五次题目集7-4java集合框架应用的分析总结:该题目是判断源码中关键字出现次数,在这题中用到集合的地方是在输入源码时,建立一个ArrayList数组来储存每一行源码,在后续还使用到arr.get、arr.set等一系列有关于ArrayList的方法。
三、 踩坑心得
- 在第四次题目集7-1中由于未考虑在二月份在闰年和平年时天数不同,导致测试点日期有误上出现答案错误。
- 在第四次题目集7-2,在Day类里定义的mon_maxum[]储存了对应月份天数的数组中,该数组的定义未考虑在二月份时闰年和平年时天数并不同,而刚开始在后续的使用时未考虑到这点,导致程序测试点出现错误。
- 在写题目时,多次忽略了无样例输入这一测试点的情况。
- 在第六次题目集7-4学号验证中,对于最后两位数字未考虑在数字1-9时前面应该要加上一个0而导致正则表达式书写有误,出现测试点错误。
- 在第五次题目集7-5中在编写代码时,仍然按照第四次题目集中的日期类聚合(一)中编写方法,令日期一天一天相加来的到下n天、前n天、两日期天数之差,在提交的时候有两个测试点出现了运行超时的错误,需要对代码进行优化,使代码在运行的时候时长减少。
- 在第四次题目集7-1中匹配日期时未考虑到平年和闰年时二月天数的情况以及在不同月份时天数不同,导致代码提交时有部分测试点错误。
四、 改进建议
在写日期类聚合中,在计算前n天、后n天、两日期天数之差时在代码中使用的是一天一天加过去,这样子代码运行时间较长,可以判断在满足条件时整个月份相加或者整年相加。
五、 总结
通过三次题目集的编写,了解到了类的继承,接口,抽象类的定义及应用但是并不熟练,同时对编写正则表达式要更加熟练了一点,还是需要多学习并巩固有关于这些方面的知识。希望老师能够将pta上题目的答案告诉我们,这样通过对比更加能够发现自己的不足,以及知道自己测试点为什么错了,错在哪里。