题目集4-6次作业的总结
一、前言
对于这次的题目集,相比较于之前的题目集来说难度提高了很多,但是经过这些题目集的锻炼,我确实掌握到了许多知识,就比如说学会了如何运用对象数组和哈希集去掉重复的数据,以及将输入的英文句子中的各个单词根据阿斯特码值的大小来进行排序,更是学会了正则表达式来检验输入的准确性以及类与类之间的聚合。总的来说,这次题目集的难度对于我来说还是有点难度的,有的题目集都没有全部完成,有些个别的题对我来说还是太难了。
二、题目集4-6的分析
1、第四次题目集的分析
1.由于题目集六的第一小题是题目集四的第一小题的进阶版,所以将题目集四的第一小题放到和题目集六的第一小题一起分析。
2.题目集四的第二小题是去掉输入数据中的重复的数据

刚开始我并不知道这个代码运行有时间限制,我就打算用双重for循环一个一个判断。


但是运行之后我才发现这个方法根本不行,运行所用的内存超过了限制。最后通过查找资料得知可以用哈希集来写这个题目。
使用哈希集可以将输入数据中没有重复的数据放进一个集合之中,由于这一题只要输出yes和no,所以我们只需要判断这个集合的元素的个数是否等与输入数据的数量就可以判断输出yes和no。
3.题目集四的第三小题和第二小题类似,只是这题需要将输入的数据去掉重复的数据之后按顺序输出。

踩坑心得:最开始写的时候我原以为这个题目和之前的题目一样要用到HashSet,但是用了之后我发现了一个问题,就是我发现这个是把没有重复的输入是放到了一个集合之中,但是我犯了一个错误,就是当时我并没有意识到直接输出是以集合的形式输出,然后我通过上网查找资料得知可以使用对象数组来将这个集合之中的元素给提取出来输出的时候输出的是一个集合,并且这个集合是无序的。
然后通过和室友的交谈和讨论之后我发现还有一个方法就是使用LinkedHashSet,这个方法可以将输入的数据有序的放进集合中,然后我们可以通过对象数组将集合中的数据给提取出来,最后再一个一个将数据输出出来。

4.题目集四的第四小题是单词的统计与排序

踩坑心得:这个题目和前一题的做法差不多,但是还要再多一个冒泡排序,判断交换的条件刚开始有点难倒我了,不分大小写和从首字母开始,相同的比较下一位。我知道了许多比较的方法,比如将它们全部变成大写或者全部变成小写进行比较。

改进建议:其实还有一种更简便的方法就是使用compareToIgnoreCase,这个可以直接忽略大小写进行比较。
通过这一题还了解到了将字符串通过一些符号分割成子字符串放入字符数组中,还了解到如果想要将一些转义字符作为分隔符号的话,要在前面加两个反斜杠。
![]()
2、第五次题目集的分析
1.题目集五的第一小题是正则表达式的QQ号检验

踩坑心得:刚开始我并没有了解如何去使用正则表达式,我想直接用if语句和字符数组的长度来判断,并且我也是这样提交的,但是我做到后面的题的时候我才发现使用正则表达式会更简单。

使用正则表达式只需要这一行代码就可以判断了。
2、题目集五的第四小题是正则表达式的学号检验

踩坑心得:在第四小题之前,我一直都没有去学什么是正则表达式,因为当时的我在之前的题目发现使用if-else语句就能够做出来,直到这一题的时候,我发现使用if-else语句会很难做出来,于是我就去了解了一下正则表达式,然后我就发现正则表达式对于这些题目来说非常的简单,只需要一行代码就能检验出来,通过这些题目,给了我一个教训,要去学习新的知识,不能固步自封。

通过学习了正则表达式,我知道了如何使用这种简便的方法去检验输入的正确性,可以省去一大堆的繁琐代码。
3、题目集五的第五小题是日期问题面向对象设计(聚合一)
类图如下:

题目是按照这个类图来完成代码,并完成相应的要求:1、求下n天;2、求前n天;3、求两个日期相差的天数。
刚开始写这个题目的时候对于聚合还不是特别的了解,但是通过按照这个类图的设计和代码,也使我一步一步地了解了聚合。聚合是一种特殊的关联形式,它是两个类之间的关系,是一种HAS-A关系,是一种单向关联。如果类具有实体引用,则称为聚合。聚合的作用是可以提高代码的可重用性。
分析:这个题目我是根据类图一步一步写出来的,首先将Year类的代码写出来,然后再写Month类,这时要将Year类聚合到Month类上,之后再将Month类聚合到Day类上,最后再将Day类聚合到DateUtil类上,通过这种逐层聚合可以缩减许多相同的代码,提高代码的可重用性。




踩坑心得:通过逐层聚合使我们减少了许多相同代码的写入,通过将一个类放到另一个类的成员对象,这样就可以调用这个类里面的方法和访问属性,这样大大节省了写相同代码的时间,使代码不用那么的繁琐,以至于逻辑清晰明了。但是当我调用里面成员对象的方法以及属性的特别是这种逐层聚合的时候就会显得有一点麻烦,如下图:

当我想调用年份的时候,由于年份是最里层的那层聚合,我需要从最外层一层一层地调用,一层一层地去get,这样写感觉会写的很麻烦和冗长。
4、题目集五的第六小题是日期问题面向对象设计(聚合二)
类图如下:

这个题目也是根据所给的类图来编写出相应的代码,并完成相应的要求:1、求下n天;2、求前n天;3、求两个日期相差的天数。
分析:这个题目与上一个题目都是聚合的问题,但是这题的类图与上一题的类图有所差异,上一题的类图是逐层聚合,而这一题的类图是将Year、Month、Day这三个类聚合到DateUtil类里面,然后将类图所提供的方法给完善。

踩坑心得:通过这种聚合方法相比较与上一题的聚合方法,这种聚合方法在调用的时候没有那么的繁琐和冗长。
3.第六次题目集的分析
本次题目集只有一个小题,但是这个小题的难度对我来说就有点高,由于这一题和题目集四的第一小题是同一类题,并且题目集六的这一题是在题目集四的第一小题的基础上再增加了许多异常功能。
1、题目集六的题目是一个菜单计价程序


分析:这个题目的要求需要很多,并且测试点测试的是异常情况,所以即便你将最基础的点菜功能写出来之后也不能通过一个测试点。刚做这个题目的时候我没有任何思路,不知道该从何写起,于是我决定将题目所提供的类先写出来

然后我根据这些所提供类的模板就开始将这些类给写出来。不过写这个题的时候我犯了一个致命的错误,就是在做之前我并没有好好的构思,而是直接开始就写,以至于我像一个无头苍蝇一样,有点摸不清方向;还有一个错误就是我开始的时候就想把差不多所有判断异常情况的方法给写出来,在这上面花费了大量的时间和精力,以至于我在后面写主函数的时间有点不够,最后这个题就没有写出来,从这次题目之后我认识到写题得一步一步来,先将最基本的框架结构写出来才能进一步地解决难题。



这是我写菜品类的时候设置的属性以及方法,因为题目在菜品上增加了特色菜功能,所以我设置了一个特色菜属性,想着主函数可以靠这个来分辨菜品是不是特色菜;我还写了一下菜品价格的输入数据的合法性判断以及计算当前菜品份额的价格,在计算中份的时候所得的价格由于有小数,所以需要进行四舍五入,于是我将所得的价格乘以10加上5再除以10就能得到四舍五入的价格。




这是我写的菜谱类,我在里面创建了一个对象数组,以便于输出菜谱的时候可以一条一条的输出,还写了一个搜索菜品的方法,通过这个方法的参数名字再菜谱数组里面查找,找到了就将找到的对象给返回出去,没有找到就返回一个空值出去;还写了一个增加菜谱的方法,先判断在菜谱里面的数组内第几条是空的,然后再将菜品传进数组里面。



这是我写的点菜记录类,有计算分量的方法和检验份额的合理性的方法,不是特色菜可以点大中小三种,特色菜只能点大份和小份。






这是我写的订单类,有点菜记录的数组以及计算订单总价格的方法和增加和删除和查找点菜记录的方法,还有一个重复记录的方法,可以将重复的记录删除。










这是我写的桌子类和时间类,有判断闰年的方法这样可以为判断输入的日期的合法性做出判断,还有判断是否在营业时间的合法性的方法以及求输入的日期来判断是星期几的方法,这个方法我是根据基姆拉尔森的日期公式写的,还有判断两个时间是否在同一时间段的方法等等。我写了很多的判断方法,但是我后面并没有时间将这些方法运用到主函数里面。



这个主函数我写的并不是很好,一点都不完善,我通过一行一行输入的字符串,然后用字符串的split方法将输入的字符串分隔成多个子字符串来进行判断,但是当我写到这的时候有许多的问题,其中一个就是对象数组总是为空,以至于我得需要大量的时间来查找问题的所在,最后发现是我没有将这个对象实例化,最后由于我之前在那些判断方法上浪费了很多时间,我没有将这个主函数给完成。
三、总结
对于这三次的题目集,我学到了很多,也发现了自己的不足,学到了正则表达式以及哈希集去掉重复数据的方法和按顺序输出没有重复数据的方法,了解到了聚合的使用,可以大大减少一些相同的代码,可以提到代码的复用性,是代码逻辑更加的清晰,不足的地方是自以为是的瞎写一通和没有制订好基本的框架结构,还没有打好地基就开始建房子,到最后一件事也没有完成。对于自身还是要好好学习,提高自己的能力才不会这么手忙脚乱。我对于改进的建议是希望能够给更多的时间来写作业。
浙公网安备 33010602011771号