第二次博客作业
第二次作业作业总结
一.前言
- 第四次题集:这次题目集总共有三题,第一题难度较大,后面的还好,这次题目集主要是运用正则表达式,还有聚合,继承等功能进行运算,主要考验我们对于正则表达式等算法的运用的熟练程度,后面知识点较为分散,主要是在聚合,和继承这一块
- 第五次题目集,这次的题目集总共有五题,题量较为适中,刚好合适,对于题目难度来说,自从上次的问卷调查,难度有所下降,这正是我们想要的,这次的题目集,多是对于数组的运用,运用数组对于数据进行操作,主要的就是后面的正则操作和进阶版的聚合
- 第六次题目集:这次的题目集总共有六题,题量还好,难度也还可以,在这次的题目集中主要考验我们的就是正则表达式,主要考验我们的运用程度,多是在字符串中运用正则,在最后的时候,更是运用了接口,倒数第二题运用了多态,继承,正确使用封装性,多态性,继承性进解题
二.设计与分析
①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
在这次题目集中7-2,写的是日期问题面向对象设计聚合类,这个题目主要有三个功能,对于求出下n天,求出前n天,求出两个日期相差的天数,主要是实现这三个功能,运用聚合的方法,将多个类联合起来,形成一个完整的体系,从而实现相应的功能,这里的聚合,通过类的一系列调用,实现相应的功能,对于每一个单独的类,又有相应的单独的功能,对于年月日的处理,各有不同的方法,而在这个功能函数里面,主要进行算法的就是DateUtil,通过这个类,将其他几个类的各类方法联系起来,进行计算实现求出天数的功能,通过类调用类,实现聚合功能,这样的一个总的聚合方法,以下的就是他的类图

以下是他的复杂度图形。,在这里各个复杂度都在合适范围内,可以被使用

然而这样一个聚合方法,在题目集5中也运用到了,题目集5的最后一体重运用的也是聚合类的方法,在这个新的聚合方法题目中,他的聚合对象是DateUtil,通过这一个类来调用其他的类,将他聚合在这一个类之中,然而改进的不只是他的聚合类型,还有他在每个类之中方法,他把许多大一类中的方法发放入了DateUtil中,这样一来,其他的类自然而然相对简单一点,没有那么复杂,把主要的功能方法全都放进了DateUtil中,使得整个体系结构都相对集中,对于用户检测代码,也较为方便,以下就是他的类图

一下是他的复杂度图形

虽然类图有所不同,但对于功能的实现还是一样的,需要的就那么几功能,没有太大的改变,主要是聚合的方法不同,引用的对象不同而已,对于其中的优劣选择第二种相较于第一种更加的直观,让人看起来觉得格外的清爽,对于整个体系来说都更加的条理清晰,结构层次分明,能有一个很好的观赏性,将几乎所有的方法集中到一个类中,使得其他相应的类具有单独的功能,这样一类整个体系结构就显得更加的直观了
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
在题目集4中第三题编写的是一个关于圆类继承的问题,这道题目要求的就是让我们有一个合法输入,对于圆的半径,矩形的长宽,球的半径还有立方体的长宽高进行输入,然后输出的就是他们的面积和体积,还有相应的表面积,相应的功能就是这些,对于不合法的数据要进行Wrong Format进行输出,在这里运用到的就是继承相应的功能类Shape是父类,其他的Circle,Rectangle就是他的子类,然后相应的球和圆也都是继承自Circle,Rerctangle,这样的一个体系,形成了一个继承关系,以下就是他继承的相关类图

在这个题目中,先建立五个类,对于每一个类都有其相应的功能,每个类代表相应的不同的图形,在每一个类中又有相应的方法,在代码这道题目的开头,先运用选择功能语句,对不同的图形进行选择,在每个选择语句中,不同的功能建立不同的对象,然后运用相应的对象去掉用相应的构造方法,从而实现语句的正常输出,在程序的开头必须先声明一下该程序调用的就是父类Shape,然后在父类中写出相应的面积方法,便于后面对其进行返回,这道题既然运用了继承方法,那自然而然有方法的复写,对于不同的类,具有相同的方法,最后在另外一个类之中再次写下相同的方法对其进行复写,将父类中的方法进行覆盖,从而实现了新的方法,因为在每个类里面,方法都是千篇一律的,所以在这里就先讲解一个类,来进行举例说明,在Circle这个类里面,主要的是由相应的构造方法,判段语句,相应的输出语句等等,这就是这道题目大概的算法,然后这里是对他的复杂程度的一个说明

然后对于新的题目集六在后面几题之中主要运用就是多态,接口,修改相应的代码来实现整体的封装性,继承性,多态性在7-5这次题目中主要让我们掌握的就是这几点了然后这里有大概的类图

这里和题目集4中7-3类的继承结构有所不同,本次作业重点研究平面图形相关的处理方法。 图形类的继承层次结构,getArea()方法为抽象方法,功能为求得图形的面积;validate()方法也为抽象方法,对图形的属 性进行合法性校验;toString()继承自 Object,功能为输出图形的面积信息,在这里Shape作为父类,子类有Circle,Rectangle,Triangle,这三个类,作为Shape的子类,都继承了他的方法,面积,合法性,等等,不过在最后都对其进行了重写,

这里的Shape抽象类在这里,并没有具体的方法体,这样一来,方便之后对其进行复写,
这里就举一个例子,在其他的类中也是这样的覆写方法,这样一来,对于不同的类可以进行调用其面积方法,判断合法性的方法,从而不会重合,导致方法调用错误的现象,使得整个代码尽然有序,条理清晰,在这里也运用了ArrayList以及Collection,这些功能的简单运用,运用这些方法对代码进行修改,以下即是对他的应用

运用ArrayList对存储的数据能够更好的进行操作,他的作用相当于数组,用它来进行数据的储存,用ArrayList对数据进行累加,比如:list1.add,这就是对数据进行储存,储存到动态数组里面去,进行一个总汇,运用list1.size即可以得到动态数组里面的元素个数,然后进行返回,然后,list1.set则可以对数据进行设置,相当于赋值的操作,然后运用list1.get得到动态数组中指定的数据,可以把它与前者相结合,从而真正实现赋值操作,这里即是运用到的动态数组,根据题目要求,在这里还需要用到多态性,即是运用多态对于不同的数据进行调用,用单个对象对于不同的方法进行调用,且得到的结果是不相同的,多态运用如下

在这里我用的是父类Shape来定义一个pShape对象,然后通过这个定义好的对象,来调用其他类中的方法,这里即是对多态大概运用,然后对于封装性,我则是用prviate对相关的属性进行了相应的包装,仅是对外提供公共访问方式,接下来,看看这道题目的圈复杂度

由于在主类中有较多的if语句,导致在Main函数中的圈复杂度较高,已经超过了10,应该对其做出相应的修改,可以运用switch语句,去代替if语句可以降低相应的复杂度,在其他的方法或者类中,复杂度还是可以的并没有太高,接下来,看看这整道题目的类图,如下

对于这道题目的讲解就到这里了,以上就是大概的功能算法中需要注意到的东西,对于一些工具的使用,要使用得恰当,当然这道题也是有很多细节的地方需要注意的,对于输出的结果要始终保持保留小数点后两位,对于数据的非法性也要好好判断,不能马虎。然后对于前面两道题目的分析已经完成了,前面主要是运用了多态,继承,封装性等,然后接下来这道题运用到的也有多态,不过还有一个新东西,就是接口这种东西,运用接口,来实现算法的,在java中接口是一种特殊的抽象类。跟一般的抽象类相比,接口里面的所有方法都是抽象方法,接口里面的所有属性都是常量。也就是说,接口里面只有方法定义而没有任何方法实现,通常使用接口来定义实现类的外观,来约束类的行为,接口有着分类的作用,对于不同的类,给其分配不同的方法,来实现相应的功能,

在这里运用接口,将其穿插其中,对不同的类进行封装隔离,对不同的方法进行分类,然后后这道题目也是一个求出面积的程序,而其中的接口为GetArea作为一个接口,无属性,只有一个GatArea的抽象方法,然后就是求出Circle的面积,Rectangle的方法,主要是在Main类中的主方法中分别定义一个圆类对象及矩形类对象,使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值,大概要求就这些了,这题较为简单,主要就是对于接口的分析,以下为他的类图:

在主函数中,输入半径,长,宽,然后对其进行传参,定义新的对象,对相应类中的方法进行调用,实现功能的输出,将接口穿插其中,以下就是他的圈复杂度了

圈复杂度还好,都在指定范围内,是合格的,这里就是对题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)的相关分析
③对三次题目集中用到的正则表达式技术的分析总结
1.在这三次题目集中每一次题目集都用到了正则表达式,且在第一题中,遇到的就是一道大题,在题目集4中第一题中,要求的我们就是使用 Java 中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算,对于南水北调,对输入的数据进行操作,判断输入的数据是否符合合法性,然后在进行下一步操作,如果数据不合法,则输出错误,输入正确的话,就进行计算,然后输出水位,同时对于输出的值,有很多不同种的,需要进行多部计算才能得到正确结果,主要就是对于输入的数据的合法性判断,找出不合法数据的位置然后进行输出即可。
2.在题目集5中的使用正则的为第4题,在这一道题中,要求的是让我们找出输入的字符串中所有的关键词,,然后对其数量进行输出即可,且找完关键字之后,要对已有的关键字进行排序,最后在进行输出,首先我们要知道java总共有53个关键字,因此,我们要把这些关键字存入数组,然后用正则在这些数组里面匹配对应的关键字,首先题目要求,让我恶魔你注释中的字符串不用统计,字符串中的关键字不用统计,首先对于源码的输入要进行判断,之后再进行匹配,然后题目要求让我们至少要用到一种List,Set或者Map中的一种,在这道题目里,我们要先把注释里的注释符存在的那整个一行进行空白符的代替,然后对于星号的注释符进行删除,在这里,我们需要仔细,对于带星号的注释符有很多种情况,要一一考虑
然后在下面先用空格将每个句子进行分割,然后再和原先定义好的关键字数组里面的字符串进行一一匹配,用Map来进行匹配后的数据的保存,对于匹配到的关键字再放入新的数组里面进行保存,最后当匹配完之后,用Array.sort进行排序,输出,核心代码如下


3.在题目集6中,多次运用正则表达式,前四小题运用的都是正则表达式,第一小题主要是判断qq号的合法性,将qq号匹配0-9,匹配5-15次,从而得到结果,在第三小题中,则是匹配验证码的正确性,用正则匹配输入的字符串中的四位数字和字母的混合字符串,如有其他非法字符,则进行非法输出,在第四题中, 要匹配的就是学生的学号,对于2020级的学生的学号进行匹配吗,开头先匹配2020,然后再对之后的专业班级进行匹配,每一个都要单独进行分析匹配,需要分几种不同的情况,核心代码如下

④题目集5(7-4)中Java集合框架应用的分析总结
在这题的7-4中,我们是求输入的字符串中的关键字,将这些关键字进行提取,我们先用正则表达式将这些单独的单词进行提出,然后再一一进行匹配,在后面的对于关键子的计算个数中,我们就要用到Map映射来进行计数Map是一个映射接口,其中的每一个元素都对应相应的key-value键值对,同样抽象类通过适配器模式实现Map的大多数的函数,Map中的集合,元素是成对存在的,每个元素由键和值两个部分组成,通过键可以找对所有对应的值,在这题里面,先用循环用equals获取匹配到的字符串,进行判断,然后用map.put设置相应的关键字,然后再用循环再次进行匹配,用map.get得到得到关键字所处位置进行返回,赋值给num,然后再在下面进行设置相应的关键字,每次再次匹配到关键字进行加一,再在后面用Arrays.sort对匹配到的所有关键字进行位置排序 ,后面再用加强循环进行输出排序

下面就是他的运行过程,运行结果如下:

三.采坑心得
1.在第四次题目集的时候,把后面集体做完了之后,才来做第一题,因为第一题对于饿哦来说还是很有难度的,之后完成后面两题后,发现自己第一题直接写不来,对于题目的意思还不是了解的很透彻导致最后并没有写出来,所以这次题目集只有零分,然后对于第二题的时候,经常在最后一天,或者最后一个月的时候,对于后几天,总是会有一些小错误,就比如下面,这次的错误数据,是由于没有对12月份天数满了之后进行分析,所以导致出现了错误

然后在对于闰年平年的2月份进行分析的时候也出现了一些小问题,错误数据如下:

再在下面那题还是较为简单,并没有什么容易掉坑的地方
2.对于题目集5来说,容易出现错误的就是7-4了,在这道题里面我们要求的就是找出相应的关键字,然后对其进行输出就可以了,但是容易掉坑的就是这道题目的正则表达式的运用,我们先要定义一个数组,对所有的关键字进行储存,然后用Map进行数据的计数,易错点就在于对于注释的地方进行删除

之前以为只要删除前后的正则,没想到之后的换行的正则也要对其进行删除,所以才导致答案,出错,然后对于这道题目,还有几个测试点没过,仍在改进

对于我写的代码,本来以为这些测试点已经过了的,但至今还是不知道错在了哪里,仍然需要继续改进,然后对于最后一小题的话,他与之前的有所不同,聚合的方式不一样,还是需要最原有的基础上进行改进不能直接套用,不然根本不符合题目的要求,需要对聚合的方式进行改进,将其他的类全都聚合到DataUtil中,之后再进行调用,这样才算是真正完成了要求
3.然后对于题目集6中的话就是第六题和第七题,在这两题中,多有用到的就是接口,多态性,代码的封装性,可继承性,对于这其中的多态性,容易掉坑,我们经常会直接定义多个新的对象来对每一个类中的方法进行调用,其实不需要的,只需要学会多态,用同一个对象,对v不同的类中的方法进行调用,这样就可以实现代码的简洁性

在这里,我们定义了一个pShape,来去调用每一个相应类中的方法进行调用,这样就可以使得代码不会看起来那么复杂,然后在这题中,我们还要考虑对于多个图形类的设置,对于多个相同的类要进行定义,多用循环进行多次重复定义,然后对于之后的那一题,我们要用到的就是接口,要用到接口,来实现相应的功能,当时没运用接口,直接写代码,会直接不符合题目要求,判为零分,接口如下:

四.改进建议
对于这次我写的代码,复杂度还是有一些超标了的,所以对于代码的改进的话,可以在复杂度上面下手,将一些for循环尽量简化,将复杂度降低,这样才能将代码写成在要求之内的,然后,对于每次作业中的类呢,要实现每个单独的功能,都要是独立的,不相互干扰,不能太过复杂,实现每个方法功能的单一性,然后实现可复用性对于正则表达式的匹配范围要严谨一点,匹配规则要符合题目要求,不能出现匹配到其他的字符串,然后接口也要熟练的使用
五.总结
通过这几次的题目集,我们对于聚合的使用有了更加透彻的了解,对于继承,多态,接口也都有了一定的了解,最后,在这次作业里面,我们收获最大的还是对于正则表达式的运用,在多次的关于正则表达式的作业中,我们能够熟练的掌握他的用法,对于不同情况下要匹配的字符串,我们能够准确的找出,能够进行匹配出来,最后对于一些细小的工具如Map,ArrayList也有了一定的练习,熟练程度也有所提高,总的来说,收获挺大的,对于这几次题目集,我觉得老师出的挺好的,难度上面把控的很好,有容易的,能够增强我们的自信心,同时也有难题,给我们带来挑战,带来更加深刻的思考,总的来说,这几次题目集出的挺好的

浙公网安备 33010602011771号