Blog2
(1)前言:
题目集4
1,水文数据校验及处理----正则表达式对输入字符串数据进行合法性校验及计算
2,日期问题面向对象设计(聚合一)-----由类图写出代码,以及实现类图中的方法。了解继承的用法
3,图形继承-----考察类的继承,使用继承,使得父类中的方法可在子类中使用
难度分析:第一题,有一定难度,要求利用正则对输入字符串进行检验,先前未在实际运用中使用正则表达式,因此该题对我而言十分吃力。
第二题,在给出类图的情况下,只需按照类图编写,以及实现其中的方法即可,难度不大。
第三题,也较为简单,图形的继承,涉及到重载的使用,以及对数据格式化输出。
题目集5
1,找出最长的单词-hebust -----考察正则表达式中Pattern类和split的用法
2,合并两个有序数组为新的有序数组-----数组的运用和排序
3,对整型数据排序----插入、选择、冒泡排序
4,统计Java程序中关键词的出现次数----arrayslist的运用,合理使用Pattern、Matcher类中的方法find
5,日期问题面向对象设计(聚合二)----合理运用聚合,使代码可复用
难度分析:第一题,利用split对输入字符串分割后,依次求出单词长度,取最大输出即可。
第二题,与前面题目集中题目相同,考察运用数组。
第三题,三种排序的实现,在C语言的学习中已经了解到,难度不大。
第四题,统计代码中的关键字,用array list将每一行加入list中,再在list中搜索关键字。
第五题,聚合的使用,在某个类中聚合其他类。
题目集6
1,正则表达式训练-QQ号校验----考察正则表达式是否匹配成功
2,字符串训练-字符排序----字符串转化为字符数组,再对字符数组排序
3,正则表达式训练-验证码校验 ----考察正则表达式的使用
4,正则表达式训练-学号校验----考察正则表达式的使用
5,图形继承与多态 -----考察类的继承、多态性及其使用方法
6,实现图形接口及多态性-----使用接口及类实现多态性
难度分析:经过前面的学习,前四题都较为基础。
第五题,与题目集4的最后一题类似,此处合理运用了多态,在不同类中,方法的功能相同。
第六题,利用接口,实现多态,较为简单。
(2)设计与分析
①题目集4(7-2)、题目集5(7-5)两种日期类聚合设计的优劣比较
题目集4(7-2)--日期问题面向对象设计(聚合一)
类图
SourceMonitor的报表:
题目集5(7-5)---日期问题面向对象设计(聚合二)
类图
SourceMonitor的报表:
优劣比较:
前者,一步步使用聚合。
后者,直接在最后将日期的类聚合同一类中。
由SourceMonitor的报表,可以明显看出后者复杂度更高,代码量与之类似,但从程序效率来看,后者不如前者。
从类图来看,后者明显逻辑更加清晰,大大减少了各类之间的关系,符合面向对象设计原则---迪米特法则---尽量减少类的耦合性。
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
题目集4(7-3)--图形继承
类图
SourceMonitor的报表:
题目集6(7-5)--图形继承与多态
类图
SourceMonitor的报表:
题目集6(7-6)--实现图形接口及多态性
类图
SourceMonitor的报表:
分析:
经过三次的练习,一步步简化代码量,提高效率。
由最开始的,直接通过继承,在子类中使用父类的方法。
再学习到使用多态,修改在子类中改写父类的方法,使得在不同图形中,都能得到相同的属性---面积。
最后,又学习到使用接口,接口的使用与多态相比,更为简便,在接口中定义抽象方法,在子类中实现。
在面对相同的问题时,使用不同的技术,达到的效果天差地别。
因此就要一步步学习新的技术,提高效率,减少代码量
③对三次题目集中用到的正则表达式技术的分析总结
三次题目集中的正则表达式,都较为简单,都是简单的检验数字是否合法。
正则表达式的基础使用
1 开始 ^ 2 结束 $ 3 数字 [0-9] 4 等价于[0-9] \d 5 小写字母 [a-z] 6 大写字母 [A-Z] 7 m-n位的数字 ^\d{m,n}$
④题目集5(7-4)中Java集合框架应用的分析总结
此题中,使用List中的ArrayList动态储存输入的数据。
ArrayList是一个可动态调整大小的实现List的集合。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
再使用get方法进行查询操作。
(3)采坑心得:
在求球的体积时,涉及到4/3的计算
1 int a=3,b=4; 2 double c=b/a;
但输出为
修改后,得到正确结果
1 double a=3,b=4; 2 double c=b/a;
在让result年份自增到result+y时,出现逻辑错误,变成了年份累加
1 for(i=0;i<y;i++) { 2 3 result.year.setValue(result.year.getValue()+i);//变成了累加 1+2+3..... 4 5 if(result.year.isLeapYear()) 6 n++; 7 8 }
修正后:先增后减,就能依次判断从result到result+y的年份是否为闰年
1 for(i=0;i<y;i++) { 2 3 result.year.setValue(result.year.getValue()+i); 4 5 if(result.year.isLeapYear()) 6 n++; 7 result.year.setValue(result.year.getValue()-i); 8 9 }
(4)改进建议:
在求日期的后n天时,初次使用的方法为一天一天的往后加天数,效率极低
1 DateUtil getNextNDays(int n){//求后N天 2 3 for(int i=0;i<n;i++) { 4 5 day.dayIncrement(); 6 7 if(!day.validate()) {//跨月 8 //月份加1 天数重置为1 9 day.getMonth().monthIncrement(); 10 11 if(!day.getMonth().validate()) {//跨年 12 //年份加1 月份 天数重置 13 day.getMonth().getYear().yearIncrement(); 14 day.getMonth().resetMin(); 15 day.resetMin(); 16 } 17 18 day.resetMin(); 19 } 20 21 } 22 DateUtil result = new DateUtil(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue()); 23 return result; 24 }
对此改进,可以将日期转化为年份和总天数,在增加n天后,计算增加年份,再将总天数转化为月份和天数。
求前n天也与之类似。
1 DateUtil getNextNDays(int n){//求后N天 2 3 int [] mon_maxnum= {31,28,31,30,31,30,31,31,30,31,30,31};//各月份的天数 4 int []a={0,31,59,90,120,151,181,212,243,273,304,334};//前面月份的总天数 5 int TotalDays=0,i=0,t=0; 6 7 for(i=0;i<day.getMonth().getValue()-1;i++) { 8 9 TotalDays+=mon_maxnum[i]; 10 } 11 12 13 t=TotalDays/365+day.getMonth().getYear().getValue();//新的年份 14 day.getMonth().getYear().setValue(t); 15 16 for(i=0;i<a.length;i++) { 17 if(TotalDays%365>a[i]) { 18 day.getMonth().setValue(i);//新的月份 19 day.setValue(TotalDays%365-a[i]); 20 } 21 } 22 23 DateUtil result = new DateUtil(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue()); 24 return result; 25 }
在合并数组并排序中,排序使用冒泡排序,
1 for(i=0;i<list3.length-1;i++) { 2 for(j=0;j<list3.length-i-1;j++) { 3 if(list3[j]>list3[j+1]) { 4 t=list3[j]; 5 list3[j]=list3[j+1]; 6 list3[j+1]=t; 7 } 8 9 10 } 11 12 }
改进,直接使用,arraylist中的方法sort,
1 Arrays.sort(list3);
(5)总结:
学到了什么:
面向对象的三个基本特征
1,封装
2,继承
3,多态
都基本了解到了如何使用,以及作用。
与之相应的,也学习到了使用重载、聚合、接口等,来一步步减少代码量,提高程序效率。
还了解到,面向对象设计的一些基本原则,迪米特法则、单一职责等等。
用正则表达式对数据的合法性检验。
需要进一步学习及研究:
正则表达式的运用不太熟练,需要多加学习和练习。
初次使用接口,接口中只能定义常量和抽象方法,还需加强学习。
还有抽象类、方法的使用。