题目集4~6总结blog
一. 前言
本篇文章将对我近期Java语言学习情况以及题目集4~6进行总结分析。
题目集四:学习Java语言的进阶型题目,涉及Java语言中正则表达式的运用,类的聚合以及类的继承,通过这些题目,我能够更加深入地掌握类的运用,进一步理解了面向对象的思想,题目集数量较少,但难度较大,对于7-1 水文数据校验及处理 中正则表达式的使用仍存在许多的困难。
题目集五:学习Java语言的普通型题目,涉及Java语言中字符串的截取,数组的排序(其中包括选择排序,插入排序,冒泡排序三种不同的方法),关键字的统计,日期类的聚合,通过这些题目,我进一步掌握了Java语言中字符串及数组的使用,对类的聚合也有了更加深入的理解,题目集数量适中,难度适中,对于7-4 统计Java程序中关键词的出现次数 也有许多不理解的地方。
题目集六:学习Java语言的普通型题目,涉及Java语言中字符串类型的检测,ASCII码的排序,图形类型的继承,多态以及接口,通过这些题目,我可以更加 熟练地使用图形类的继承,对于接口也有了一定初步的理解,题目集数量适中,难度适中,对于完全按照指导书中的思路编写程序仍然需要进一步的思考。
二. 设计与分析
1.对于题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
(1) 题目集4(7-2)
类图:

生成报表:

部分代码:
public DateUtil getNextNDays(int n){ Year a=new Year(); Month b=new Month(); Day c=new Day(); int[] aa=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int k; k = b.month; if(a.isLeapYear(a.year)) aa[2] = 29; long days ; long d = c.day; days = n + d; if(days<aa[k]) d = d + n; else { if(a.isLeapYear(a.year)) aa[2] = 29; else aa[2] = 28; for(;days>aa[k];k++) { days = days -aa[k]; if(k==12) { k=0; a.year++;} if(a.isLeapYear(a.year)) aa[2] = 29; else aa[2] = 28; } } c.day = (int) days; b.month = k; DateUtil time = new DateUtil(a.year,b.month,c.day); String str1 = time.toString(); return time; }
本题要求测试三个日期功能,首先根据题目要求创建一个public类(Main),再分别创建四个类(Year,Month,Day,Dateutil),在Year,Month,Day中分别进行年、月、日的封装,通过Month类引用Year类,通过Day类引用Month类,通过Dateutil类引用Day类,最后,通过Main类调用Dateutil类,实现日期的计算,本题通过类与类之间的引用,最终完成类的聚合,实现三个日期的功能。难度适中,使我初步了解了如何通过类与类之间的引用实现类的聚合。
(2) 题目集5(7-5)
类图:

生成报表:

部分代码:
public DateUtil getNextNDays(int n){ int k; k = month; if(isLeapYear(year)) a[2] = 29; long days ; long d = day; days = n + d; if(days<a[k]) d = d + n; else { if(isLeapYear(year)) a[2] = 29; else a[2] = 28; for(;days>a[k];k++) { days = days -a[k]; if(k==12) { k=0; year++;} if(isLeapYear(year)) a[2] = 29; else a[2] = 28; } } day = (int) days; month = k; DateUtil time = new DateUtil(year,month,day); String str1 = time.toString(); return time; }
本题要求测试三个日期功能,首先根据题目要求创建一个public类(Main),再分别创建四个类(Year,Month,Day,Dateutil),在Year,Month,Day中分别进行年、月、日的封装,通过Dateutil类引用Year,Month,Day三个类,实现日期的计算,本题通过一个类引用三个类直接完成类的聚合,实现三个日期的功能。难度适中,使我进一步了解了如何通过一个类引用多个类实现类的聚合。
(3) 对比分析:
第一题类的聚合,是通过不同类之间的相互引用完成的,在我看来,这类似与类与类之间的继承,这种做法条理清晰,出现bug也易于修改,第二题则是通过一个类引用多个类,这种方法对于我来说更容易理解,更加容易实现题目所需要求,且效率更高。
2.对于题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用
(1) 题目集4(7-3)
类图:

生成报表:

部分代码:
class Rectangle extends Shape{ private double width; private double length; public double getWidth(){ return width; } public void setWidth(double width){ this.width=width; } public double getLength(){ return length; } public void setLength(double length){ this.length=length; } public double getArea(){ return width*length; } }
本题要求通过图形继承的方式完成对图形面积与体积的求解,首先根据题目要求创建一个public类(Main),再分别创建五个类(Shape,Circle,Rectangle,Ball,Box)使得Circle,Rectangle类继承自Shape类,即class Circle extends Shape,class Rectangle extends Shape,完成图形面积的计算,再使得Ball,Box类继承自Circle,Rectangle类,完成图形体积的计算,最后通过Main类进行调用赋值,完成题目所需的要求,本题需要通过运用继承的思想,实现代码的重复使用,难度较易,通过这道题,我初步理解了如何通过继承的方法减少部分重复代码的再次声明。
(2) 题目集6(7-5)
类图:

生成报表:

部分代码:
class Triangle extends Shape{ private double a1; private double b1; private double c1; public double geta(){ return a1; } public void seta(double a1){ this.a1=a1; } public double getb(){ return b1; } public void setb(double b1){ this.b1=b1; } public double getc(){ return c1; } public void setc(double c1){ this.c1=c1; } public boolean check(int a,int b,int c,double p[]) { int j=0; for(int i=a+2*b;i<a+2*b+3*c-1;i=i+3) { if(p[i]+p[i+1]>p[i+2]&&p[i]+p[i+2]>p[i+1]&&p[i+2]+p[i+1]>p[i]) { j++; } } if(j==c) return true; else return false; } public double getArea(){ double d=(a1+b1+c1)/2; double S=Math.sqrt(d*(d-a1)*(d-b1)*(d-c1)); return S; } }
本题要求通过图形继承的方式完成对图形面积的求解,首先创建一个public类(Main),再分别创建五个类(Shape,Circle,Rectangle,Triangle,checkcheck)使得Circle,Rectangle,Triangle类继承自Shape类,即class Circle extends Shape,在此类中完成圆的面积的计算,class Rectangle extends Shape,在此类中完成矩形面积的计算,class Triangle extends Shape,在此类中完成三角形面积的计算,在checkcheck类中通过Boolean方法对输入的数据进行检验,最后通过Main类进行调用赋值,完成题目所需的要求,本题需要通过运用继承的思想,实现代码的重复使用,并熟悉多态的应用,难度适中,通过这道题,我更加熟悉了继承方法的应用,理解了对象在不同情况下的不同表现。
(3) 题目集6(7-6)
类图:

生成报表:

部分代码:
class Rectangle extends Shape{ private double m; private double n; public double getWidth(){ return m; } public void setWidth(double m){ this.m=m; } public double getLength(){ return n; } public void setLength(double n){ this.n=n; } public double getArea(){ return m*n; } }
本题要求通过接口的应用完成对图形面积的求解,首先创建一个public类(Main),再分别创建三个类(GetArea,Circle,Rectangle)在Circle类中完成圆的面积的计算,在Rectangle类中完成矩形面积的计算,再通过GetArea接口实现Circle,Rectangle类中getArea的方法,最后通过Main类进行调用赋值,完成题目所需的要求,,本题需要运用接口的思想,实现所规定的抽象方法,难度适中,通过这道题,我了解了接口的使用规则,也对抽象类有了进一步的理解。
3.正则表达式技术的分析总结
对于正则表达式的应用我仍然无法完全掌握,在题目集三的一元多项式求导,以及题目集四的水文数据校验及处理中,我始终无法完全理解题目意思,不知从何处下手,不过在后续正则表达式训练-QQ号校验 以及将大象装进冰箱的实验中,我也慢慢熟悉了正则表达式的基本用法,同时通过自己查找资料,也初步掌握了正则表达式的基本语法。


4.题目集5(7-4)中Java集合框架应用的分析总结
在集合框架的应用中,我通过查找部分资料,初步理解了Java集合框架的大致结构,其可大致分为以下五个部分List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)其大致框架如下:

对于集合框架的应用我会再接下来的学习中,不断地深入理解。
三、采坑心得
在完成题目集4(7-2)的过程中,由于没有正确使用聚合关系的代码,导致方法间的调用一直出现问题,以至于无论输入什么数值,得到的输出一直为Date Format is Wrong,后来通过查找资料,在类的声明前,加上static,成功解决了问题。
在通过splite()函数解决字符串的分割问题时,我使用一下语句 str.splite(" ") ,运行以后发现无法成功分割字符串,后来意识到,我所需要的分割的是正则表达式,需要运用到转义的思想,最后将代码改为str.splite("\\s") ,才得以成功运行。
四,改进建议
根据对生成报表的分析,发现部分代码过于杂糅,if语句使用过多,运行效率较慢, 可对代码进一步修改,比如:将if语句修改为switch case 语句,以此来提高运行效率。
在进行字符串的练习时,我发现可以通过正则表达式与字符串数组两种方式解决问题,而使用正则表达式的优点是很明显的,它能够简化代码,显著提高代码的运行效率,。
五.总结
本阶段的三次题目集是将我们使我们更加深入了解了Java语言的世界,通过这三次题目集的练习,我掌握了Java语言的聚合,继承,多态,接口等基本方法,引发了我对面向对象的思考,在正则表达式以及更多的Java方法仍然需要我不断地学习,同时希望老师能讲解一些pta题目集上较难的题目,上课的方式我倾向于讲题目,通过例题引出基本的知识点,在实践中学习,在课上课下都可以组织同学们进行相应的题目训练,以加强我们对知识的掌握。

浙公网安备 33010602011771号