Blog 02
面向对象程序设计第二次博客
Blog 02
一、前言
题目集4~6知识点总结
题目集4:
本次题目集主要在于对正则表达式的进一步考验以及对类的使用聚合以及继承的掌握程度的阶段性考察。
本次题目集共3题,就我个人的感觉而言,难度前两道题相比前几次略难,第三道题相对而言更简单一点,只是写的内容更多一点。
题目集5:
本次题目集主要对字符串、数组、三种排序方法、正则表达式和HashMap的运用以及上一题目集中的另一种类的聚合的运用,总体上是对前几周学习成果的一次综合性小考察,涉及的知识点较为广泛,其中第4题中要用到的HashMap需要去自主学习。
本次题目集共5题,我个人认为难度适中,前三道题属于最基本的内容,第四题因为涉及到新知识所以难度较大且进度较慢,第五道题与上一题目集的第二题有着相似之处,所以做起来更得心应手一点。
题目集6:
本次题目集主要针对正则表达式、字符串排序等基础知识点进行了部分题目的训练,主要是为了加强对这类知识点的印象和熟悉度,后两题涉及到的是图形的继承、多态以及接口的知识点,达到了学以致用的目的,将刚学习的或还没完整学习的内容如接口通过线上题目的形式进行考察,能够体现学生的自我学习能力。
本次题目集共6题,题目难度相比前几次有明显下降,如前4道题我个人认为是属于入门级别的,后两道题因为涉及到刚学习或还没学透的内容就稍微更难一点点,但也不会难到太离谱。
二、设计与分析
(1)题目集4
题1:本题我并没有做完,只是将判断正误的功能和输入的功能做完了,对于用正则表达式的匹配并没有太多头绪,同时对于通过输入达到输出的这个功能也没有完全弄明白。
题2:本题我起初犯了许多低级错误,比如输入错误和判断正误的逻辑错误,这道题给我的感觉就是各种方法引用和日期计算判断较为繁琐,也特别容易出错,在此我也想对本题和题目集5的第五题的两种类聚合方式做出我自己的分析,
以下分别为两个题目的类图参考:


分析如下:
对于题目集4的类图设计分析,每个类之间的联系不够紧密,而且每个类中有许多方法是重复的,方法引用也没有完全覆盖到整个类的层面;相反,题目集5中的类图设计能够直观地反映每个类与DateUtil类的关联,从而加强了每个类的关联程度,大部分的方法也放在了DateUtil类中,这样就使得同一种方法可以复用到不同的类中,提高了代码的效率性和实用性,因此类聚合(二)的类图设计要比类聚合(一)的类图设计更优异也更实用。
在面向对象设计原则中涉及到的相关代码的优越性的体现也表明类聚合(二)的类图设计比(一)更符合要求,更符合代码设计原则。
以下是我自己写的代码生成的类图:

虽然与题给的类图不太一致,但也能得到相应的答案。
圈复杂度如图:

题3:本题主要是考察了类的继承的知识点,以下为题目要求截图:

题目中类与类的继承给的十分明确,以及各种方法的运用也在题目中说明了,因此并没有太多的困难,只是在每个类中的构造方法和getter和setter方法较多,导致整个代码看上去量稍微多了一点。

主函数的输入和判断实例的部分内容如上图所示,通过输入不同的n来达到不同的输出内容,n错误则输出“Wrong Format”,代码类图如下:

类图中也能较为直观地看出类与类的继承关系。
(2)题目集5
总复杂度:

题目1:
本题是要从输入的字符串中找出长度最长的单词,我的思路是:每个单词由空格隔开,因此就以空格为基准来分离字符串,将单词分离出来,再通过for循环不断对比字符串数组的size大小,最后将最大的size下标的字符串内容进行输出,即所得为最大长度的单词了。
以下为主要的功能实现代码截图:

我个人认为本题难度不算很大,算比较常规的题目,只是用到了很少用到的split。
题目2:
本题算是第二次做了,之前的题目集也做过一次类似的合并数组排序的题目,这次算是一次小小的复习,本次题目也用到了arraycopy,通过该方法将需要合并的数组的下标连在一起放在一个总的大数组中,然后再用Arrays.sort的排序方法进行升序排序,最后输出。主要功能代码截图如下:

本题我容易出错的地方在于思维惯性而导致坐标越界以及坐标搞错了导致漏了某个或某些数字,最后经过不断的调试也是没有很大问题通过了。
题目3:
本题带有一定的c语言特色,本质与c语言中的三种排序方法差不多,只是某些语句要用java的语句格式和方法替换。
对插入排序,用到了双重for循环嵌套,通过遍历来对不合适的数组坐标位置的值进行对调,最后再用for循环输出。
对选择排序,也用到了双重for循环嵌套,通过不断地与最小坐标的值进行比较,然后再进行对调,最后再for循环输出(这次我用到了加强型for循环)。
对冒泡排序,这也c语言是最常用和最简单的排序方法,也用到了双重for循环嵌套,对相邻坐标的两个值进行比较后再调换,反复进行此操作,然后再for循环输出。
本题还是带有c语言的基础的特点,因此有过c语言基础不会觉得特别难。
复杂度:

题目4:
这道题要用到正则表达式和HashMap的内容,恰巧这两个部分都是我相对比较薄弱的地方,尤其是HashMap,由于之前从来没有接触过,上网查资料也只是了解到浅显的一点点内容,对于实践还是明显不够的。
这道题起初我只完成了无代码输入测试点,后来通过对正则表达式的琢磨也陆续完成了空格、“{”、“[]”、“,”、“;”、“.”、“()”的分隔,但又在统计关键字出现次数的地方卡住了,也就是对HashMap各种方法的用法的不熟悉。
题目5:
本题的分析与题目集4的第2题合并在一起分析,此处就不再做分析。
(3)题目集6
总复杂度:

题目1—4:由于此四道题较为简单和基础,所以就不做太多分析,主要是对正则表达式的运用和字符串的ASCII值排序的知识点,工程量不大,题目相对简单。
题目5:
本题主要是考察对类的继承、多态性及其使用方法,下图为图形类的继承层次结构图:

本题将近几周学到的内容充分地体现了出来,在实践中对其进行应用和巩固加深基础。基本的输入输出要求本题的要求提示和输入输出样例里给的还是十分清楚的,在主类中先设置好3个数a、b、c来接受输入的想要的相应图形数。
本题中的Shape类为一个抽象类,其中的方法也为抽象方法,因此在其他的图形类中对Shape类进行继承后想要用同名的方法如判断正误的validate()方法就要通过覆写来实现,求面积的方法getArea()也是如此。源代码的类图如下:

我认为本题的难点在于如何对每个相同类型的图形的不同值的属性得到的面积进行相应的输出和排序,起初我是创建了一个数组,长度为a + b + c,用于将所有的图形面积整合到一起,最后进行排序,但在调试代码的过程中我发现,这一步骤也有一定的难点和困扰点,对与你传入的数据很难对其进行准确的数组下标的定位,所以经常调试出的结果会出现0.00或其他不符合的数字。后来在主函数main中对if-else判断中做了一些改进,用一个命名为store的数组,长度依旧是a + b + c,再定义一个t变量,初始值为0,再在if语句中分别对a,b,c进行判断,对每个图形类型也创建相应的数组,通过联系a、b、c的数量和i,进行循环输入相应的属性求面积,覆写getArea()方法,若满足其他相应的需求,下标++,即t++,如:
store[t++] = circle[i].getArea();
store[t++] = rec[i].getArea();
store[t++] = tri[i].getArea();
这样做能够保证每一个下标位置都能有相应的数据录入,最后通过Arrays.sort()来进行升序排序,这样就完成了sorted area的功能,顺带之前完成的original area功能,本题的大体问题差不多就得到了解决。
复杂度:

题目6:
本题主要是考察对接口内容知识的掌握,以GetArea作为一个接口,其中只有一个抽象方法GetArea(),该接口分别放在Circle类和Rectangle类中。
接口也是一个类似抽象类的东西,但它无法被实例化,可以被实现。
如在代码中运用接口:
public class A implements B{
里面放的是相应的方法或属性
}
接口与继承的用法也有相似点,因此上手并不难,而且接口允许多继承,大大增加了代码的方便性与简洁性。
复杂度:

三、采坑心得
1、获取数组的长度时,例如:

对于数组整体的长度是用”p.length”形式,而对于其中的某个元素的长度则是用”p[i].length()”形式,要注意的是length后面后者相较前者多了一对”()”,之前就是忽略了这里而导致程序报错。
2、在switch语句中忘加break退出。
有的时候程序的其他部分其实都写对了,但就是因为没有在switch语句里每个case后面加上break,导致整个代码跑出来的程序陷入了循环或出现了错误的结果,连续多次检查和调试将break补上后代码就能运行成功。
3、对抽象类abstract里面对其中的方法忘记覆写。
有的时候在abstract抽象类的使用中,其中的方法在其他类中复用时经常忘记加上@override,这也导致程序经常报错。
四、改进建议
1、在boolean类型方法的if判断中,例如:
if(days < 0){
return true;
}
else{
return false;
}
可以改进为:
if(days < 0){
return false;
}
return true;
并且在之后方法的引用判断时可以简略:
if(validate() == false)可以简略为if(!validate())
这样做可以减少代码的复杂度并且减少代码量达到相同的功能目的。
2、在创建类的引用时可以将所有类的定义放在一个特定的类里:
如:class Lei{
Rectangle rectangle = new Rectangle();
Circle circle = new Circle();
}
这样就可以避免在每个类中多次创建同一种引用对象而导致栈溢出。
3、可以用一个数组来代替创建的类引用对象,如:

这样可以解决许多要分类输出的程序功能,而不是通过创建好几个类似的单个类引用对象,这样反而会增加代码的负担量和圈复杂度。
五、总结
这几次题目集的题量在逐渐增加,难度也在潜移默化地提高,但是还是能掌握绝大部分的知识点,但正则表达式的进阶内容还是有一定的提高空间,对HashMap的使用也不够熟练,在平时下的功夫还是不够。
其次,这几次题目集有较多的对之前知识的巩固和复习的题目,加强自己对某一稍微薄弱的知识点的进一步理解和加深印象。对于一些实在没有什么头绪的题目也要自己去寻找相关资料和相类似的题目,努力钻研彻底弄懂,而不能一拖再拖,这次的几次题目就反映除了我比较拖拉的缺点,也在警示着我在这一方面要做得更好。
总之,这一次的几个题目集也充分体现了我的薄弱点和知识点缺失点,我会从自身来找原因,结合前几次的题目集,相互比较,并着重攻克知识难点。我希望之后的题目集也可以继续做到这几次的效果,我也会抽出更多的时间来提前学习、预习还没学习的知识点和查资料找到实用的方法和代码方法。

浙公网安备 33010602011771号