第4,5,6次题目集大致总结

------------恢复内容开始------------

第4,5,6次题目集大致总结   

在这几次的题目集题目中,进一步接触到了类的使用方法。对前面封装性进一步深入,了解了类的继承,聚合,多态。在针对各项题目的要求时,初步的学习掌握了一点类使用的方法,在这里对几个有代表性的题目做了大致分析总结。

题目集4(7-2)和题目集5(7-4)对比分析:

这两次题目的内容类似,均是考虑日期问题,设计了多个类,用聚合的方式让多个类间产生联系,使数据之间能产生交互。但是两个题目中所使用的类的不尽相同,聚合方式大相径庭,所以在下面我对比两个题目进行大致分析,仅供参考。

 首先对题目集4(7-2)分析:在本次题目中已经给了类图,所以对着类图进行构建类和构造方法。

第4,5,6次题目集大致总结

 

 分析类图,需要构建如下几个类,分别是Year类,Month类,Day类,DateUtil类和主类,很显然数据的处理汇总方法都包含在DateUtil类中,Year类和Month类及Day类均是实体类用于存储和传输数据,最后在DateUtil这个业务类中进行数据的操作并且返回。如下通过介绍遇到的问题分析情况:

第4,5,6次题目集大致总结

 

如这样直接访问变量的话没有体现到聚合的思想,第4,5,6次题目集大致总结于是我改为通过Year这个类在Month类中访问来体现聚合思想。

 

第4,5,6次题目集大致总结

 

 不是变量无法进行运算,于是我int j = day.getYear().getValue()++;让其能进行加减乘除的运算,在其他多个地方我也用到了这样的思想,不一一枚举。

开始没有考虑到如何实现返回值是DateUtil类型的量,第一次接触到返回一个类型的数据,了解一下方面知识后,先构造函数,通过如此方法实例化DateUtil的一个对象,返回定义的对象即可。

第4,5,6次题目集大致总结

 

 遇到了多个空指针的情况,总结后发现是访问方式不对。观察类图后发现不能在DateUtil类中直接get到year和month的值

第4,5,6次题目集大致总结

 

 修改后我在Month类中添加了带参构造方法,访问了year的值

第4,5,6次题目集大致总结

 

 同时又在Day类中实例化了year这个对象,并用set访问了month这个值。

问题总结:通过几次失误,我大概有了这么一个想法:三个类,Day,Month,Year类形成了一个链表结构,DateUtil作为链表的头结点里面包含了Day类这个指针同时又有day数据,通过Day这个指针指向了Month类。Month类中又有month数据又指向Year这个类,Year这个类中包含的year数据得以被访问,如此把一个一个类联系起来应该就是聚合,不过这只是我的浅显思考(不知道对不对)

介绍下本题出现的核心算法:

第4,5,6次题目集大致总结

 

 比较大小的代码思路很简单,先比较两个日期的年份是否存在差异,如若相等则接着比较月份同上的往下比日期,这样就得到了两个数据之间的大小关系。

第4,5,6次题目集大致总结

 

 第4,5,6次题目集大致总结

 

  求下某天的算法思路是:由于day.getValue();, day.getMonth().getYear().getValue();均不能以变量的形式出现进行运算,所以我调用了Decrement和Increment方法,进行所求下min天数的循环,首先分成两类,是否该年为闰年,接着让天数一天天增加,如果增加到等于本月最大的天数时证明月份发生改变此时月份加一,日期复位,年份情况类似,即月份超过十二则加一同时月份复位,求前几天的算法思路类似,即使循环伴随着日期的减小,同时判断日期是否需要复位,月份是否需要变化,进而带动年份的变化,不加赘述。

求两天的相差天数时让我联想到了上次题目集中出现的求距离公元0001年1月1日的问题,所以我可以求出这两个日期距离公元0001年1月1日的天数,然后返回两个数据差的绝对值即可。

第4,5,6次题目集大致总结

 

 第4,5,6次题目集大致总结

 

 通过循环来判断距离公元0001年1月1日的年数天数,存在j里面然后用switch语句选择月份情况,在这里我是默认了2月是28天,则在下面我进行了闰年且对月份是否超过了2进行判断,如果该年份为闰年且超过了2即证明他默认了28天则需要加1最后返回加上自己的那一天,这样就得到了距离公元0001年1月1日的天数,然后做差输出。

再对题目集5(7-5)分析:

第4,5,6次题目集大致总结

 

 分析类图非常明显看出,本次题目的Year,Month,Day类可以直接被DateUtil类访问,由于算法问题和上一题基本一样,只是原本Day类所含有的复位方法被移除和输出方式不相同而已,不再介绍。遇到的问题只有个别构造方法错误导致参数未被传入,很轻松的别解决。

对比两题中的聚合方式不同的思考:

首先面对两题中给出的类图,察觉到参数的调用方式不同,第一个聚合中Day,Month,Year类形成了一个链表结构,DateUtil作为链表的头结点里面包含了Day类这个指针同时又有day数据,通过Day这个指针指向了Month类。Month类中又有month数据又指向Year这个类,Year这个类中包含的year数据得以被访问,如此把一个一个类联系起来,然后第二个中是通过DateUtil直接访问Year,Month,Day类中的数据,这两个的差别就像一个是一条单向的直线,每个类如同线上的一个点,必须知道上一个点才能走向下一个点,另一个中的除DateUtil每个类就像多边形上的顶点,DateUtil像是位于中心的一个点,除DateUtil每个类并无关系,DateUtil可以直接访问每个类中的数据,这样我感觉会导致整体程序的效率前者不如后者,直接访问数据或许会比间接效率更加高。更重要的是再得到老师指点后对面向对象的可复用性的思考。如果单纯的只是为了提高程序运行的效率为何不适用c语言这类面向过程效率很高的语言呢?顺着这个思路,我注意到在类图一中Year,Month,Day类中所包含的方法具有差异,而在类图二中这三个类相差的仅仅是变量名而已,大大提高了可复用性。下面复杂度图大致分析:

第4,5,6次题目集大致总结

 

 第4,5,6次题目集大致总结

 

 两者复杂度相差并不大,效率应该没有很大的差异,真正要注意的是类的可复用性,学会面向对象思考。

对题目集4(7-3)题目集6(7-5,7-6)图形继承问题的思考:

题目集4(7-3),题目集6(7-5,7-6)围绕的都是关于图形的继承问题,输入一些数据输出图形类型和面积或体积。

在题目集4(7-3)首次接触到了继承的概念,了解到先构建父类,用extends关键词继承父类的方法和属性等等,也可以在子类中重写父类的方法。

遇到的一些问题:

1.没有在子类中重写父类的方法,导致输出的结果错误。2.没有正确的使用ArrayList,存储数据出现问题。3.没有用接口去引入对象而且用了使用接口的类。4.没有使用super语句。

5.一些算法设计和输出问题。

题目集4(7-3)简要分析:

第4,5,6次题目集大致总结

 

 

 Shape 类作为两个类的父类,其中只有一个求面积的方法,在两个类中都被重写。然后 Box 类 和 Ball 类分别继承了Rectangle 和 Circle 类,具有一个特殊的求体积方法,根据题目给的样例不难推断如何设计输入和输出。

题目6集

(7-5)简要分析:

第4,5,6次题目集大致总结

 

 

 观察类图,本次是Shape类作为Rectangle,Triangle,Circle类的父类,其中包含了toString(),求面积,以及判断输入合法性的方法,然后三个类中的属性由于所求得东西不同而不同。在本题中是循环输入一些值来判断,所以可以使用动态数组进行存储。同时由于使用的是动态数组,不知道如何去排序,于是我使用一个数组来存储动态数组中的数组来排序,因为一开始输入时我已经知道了数据的规模。

第4,5,6次题目集大致总结

 

 总的来说,练习中获得的是如何去继承并重写从而达到多态化的目的。

题目集6(7-6)简要分析:

在本次题目中首次接触到了接口的概念,即可以定义一个接口让其他的类去使用,有点类似于继承的样子。

 

 

第4,5,6次题目集大致总结

 

 

 根据题目的需要,接口的定义很使用也很简单。

第4,5,6次题目集大致总结

 

 题目的要求并不是,要求仅是非法输入的判断和求相关面积,所以在接口中我写入对面积的求取方法,并在下面的类中重写。注意使用接口,初次时我是直接用的是类来实例化了对象,而题目的目的是如何使用接口。

做完题目后的反思:

在这三题之中,首次接触到了继承和接口的使用,即多态的概念,同时获取了更对对封装性的经验。总的来说本次题目中涉及到的难度并不到,算法设计和主体框架并没有很复杂,一些非法输入的测试轻松的被解决,输出的值并不需要很繁琐的计算过程,但是涉及到了使用对所定义类的类型的动态数组,接口,和继承的相关知识,算初步的尝试。

java集合框架和正则表达式使用的心得:

这三次题目集中多次出现对正则表达式使用的练习,虽然难度不大,但是提升了对正则表达式使用的熟练度。

如题目集4(7-1)中的判断,但是我的做法却很简单,没有熟练使用正则表达式。输入的数据是一个一个的字符串,每个数据中包含了不同的相关数据均以|来分隔,于是我考虑到了可以以split方法来进行分割,于此来对每一个单位的数据进行合法判断和分析。并且使用了replaceall方法来除去一些对分割产生影响的字符。但是还是没有体现到正则表达式的熟练使用,在下面我仅仅是每个字符串采用了常规方法操作。

自从这次后深深体会到了学好正则表达式的重要性,因为其中包含了很对能对字符串操作的方法。如search() ,match()等等。

第4,5,6次题目集大致总结

 

 

 

在题目集6(7-3)中有很经典的正则表达式使用方法,校验验证码。根据题目的要求,我构建了一个表达式,即包含了除去所有字母和数字,那么匹配到了字符就min++,在下面添加一个判断语句即可。

第4,5,6次题目集大致总结

 

 

还有7-4的学号判断中,可以先判断输入的学号是否合法,然后分块处理。

在题目集5(7-4)统计关键词中遇到了一些问题,我的最初想法是先判断输入合法后,在建立一个字符串数组包含了所有的关键词,又通过如下方法,替代掉所有符号并分割,这样我就会得到仅含一堆是或非关键词的单词,接下来双循环嵌套来把分割后得到的字符串数组和关键词字符串数组一一比对。但是我没有设计好如何除去注释的方法,导致注释无法被正常除去,我的想法是通过contains方法对输入的每个字符进行扫描判断是否含"//"如果有那么就覆盖他们在字符串数组中的位置,另一种注释可找出"/*"和"*/"的下标,然后通过循环进行覆盖,但是实践中遇到了一些问题,导致好几个测试点过不了。

第4,5,6次题目集大致总结

 

 map的使用:

题目集5(7-4)中首次使用到了map,map包含了Hashmap,Treemap等等,根据需求我使用了Treemap,因为它能够自动排序输入的字符。通过如下方法我完成了对数据存于map中的过程。如果该关键词的数

第4,5,6次题目集大致总结

 

 

 不为一那么把它放入map之中。然后如下的使用增强循环对map进行了输出。

第4,5,6次题目集大致总结

 

 心得小结:

1.正则表达式的引入使用,对字符串的操作相较于常规操作确实如老师说的像小汽车对比自行车,但是正则表达式的构建对初学者来说难度还是相当大的,一个合适的表达式需要长时间的思考。

2.ArrayList的使用确实在面对一些无法一开始就获取输入数据的规模时有很不错的效果,同时还可以存入数组中来操作数据。

3.map的初次使用,让我感觉想“进阶版的数组“它包含Key和Value两个属性,可以通过Key来找到Value,不过总的来说接触的次数不多不是很了解相关知识。

本阶段的学习和建议:

每个阶段的学习都能学到新东西,本次所接触的新知识有正则表达式,类的聚合,继承和多态和接口还有map数据结构。虽然练习的强度不是很大学的不够深,但是还是初步感受了这些知识能容,入门的使用正则表达式,和继承及聚合的基本框架,了解到了子类该如何去继承父类,在继承后又要根据实际情况来重写方法,及父类和子类间在方法和属性上的关系,子类必须含有父类中的所有方法但是可以重写。类的聚合也了解了一点点怎么在一个类中去调用另一个类中的方法和数据,要在实例化对象后,分别构造所需方法来传递数据。map现阶段学到的不多,是关于Treemap的赋值和通过增强for循环输出。正则表达式学的最多的还是如何去构建一个表达式,使用方法了解到的有replaceAll,split,match等。

以我的拙见,现如今的学习方式和题目难度比较适合我这样学习能力不是很强的学生,

 

 

 

 

 

 

 

------------恢复内容结束------------

上一篇:java常用工具


下一篇:3hutool实战:DateUtil-获取日期的各种内容