一、三次题目集总结(4-6)

题量和难度:题目集4只有3道题目,在这几次题目集里算是很少的了,但是所谓浓缩是精华,题目集少代表着题目相对前几次题目集来说比较难,这次的第一题是最难的,第二题次之,第三题最简单。题目集5和题目集6题目的量比较多,但都只有一题是最难最花时间的。

知识点:

  1. 正则表达式的在多种情况下的使用方法,用字符串方法对字符串进行处理
  2. 对聚合的理解和使用
  3. 初步认识继承关系以及方法重写
  4. 冒泡、选择、插入排序
  5. 多态和接口
  6. ArrayList类的使用

二、设计与分析

关于题目集4(7-2)、题目集5(7-4)两种日期类聚合设计

 

题目集4(7-2)的是用DateUtil类聚合Day类,Day类聚合Month类,Month类聚合Year

而题目集5(7-5)的是用DateUtil类聚合Day,Month,Year三个类。

这两者各个类中的方法大体来说没有改变,就我自身写代码时的感受而言,相对题目集题目集5(7-4)来说,题目集4(7-2)的聚合设计,写起来会相对更为繁琐,主要在于DateUtil类中需要用到其他类中的方法,题目集5(7-4)中的调用更加直接(因为DateUtil类中有Year、Month、Day类型的引用变量),而题目集4(7-2)中的DateUtil类只有day一个引用变量,Month类型引用变量在Day类中,Year类型引用变量在Month类中,这导致调用Month,Year类中的方法时需要多更多步骤,相应的增加了写代码的工作。总的来说,我认为题目集5(7-4)中的聚合设计更好些。

题目集4(7-2)

        //比较两个日期的大小
        public boolean compareDates(DateUtil date) {
            if(this.getDay().getMonth().getYear().getValue()>date.getDay().getMonth().getYear().getValue())
                return false;
            if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()) {
                if(this.getDay().getMonth().getValue()>date.getDay().getMonth().getValue())
                    return false;
                if(this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()) {
                    if(this.getDay().getValue()>date.getDay().getValue())
                        return false;
                }
            }
            return true;
        }

题目集5(7-4)

        //比较两个日期的大小
        public boolean compareDates(DateUtil date) {
            if(this.getYear().getValue()>date.getYear().getValue())
                return false;
            if(this.getYear().getValue()==date.getYear().getValue()) {
                if(this.getMonth().getValue()>date.getMonth().getValue())
                    return false;
                if(this.getMonth().getValue()==date.getMonth().getValue()) {
                    if(this.getDay().getValue()>date.getDay().getValue())
                        return false;
                }
            }
            return true;
        }

从这两个相同方法代码长度来看,题目集5要优于题目集4。

题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

思路:

  1. 题目集4(7-3) 根据题目要求,我写了类Shape,类Circle,继承自Shape,类Rectangle,继承自Shape,类Ball,继承自Circle,类Box,继承自Rectangle,并重写子类计算面积的方法。
  2. 题目集6(7-6) 根据题目要求,我写了一个GetArea接口,并在Circle类和Rectangle类实现接口。
  3. 题目集6(7-5)根据题目要求,先写抽象类Shape,Circle类,Rectangle类,Triangle类继承自Shape,再添加一个类实现Shape对象的添加,排序以及输出排序和计算后的结果。

技术运用:

  1. 题目集4(7-3)运用了封装、继承。
  2. 题目集6(7-5)运用了封装、继承和多态。
  3. 题目集6(7-6)运用了封装、继承、多态、接口。

三次题目集中用到的正则表达式技术的分析总结

 

出现正则的题目有题目集4(7-1)、题目集5(7-4)、题目集6(7-1)(7-3)(7-4)。题目集题目集4(7-1)、题目集5(7-4)这两道题比较难,题目集6(7-1)(7-3)(7-4)这三道题比较简单。

  1. 对于数字的匹配,可以使用[单一数字或多个数字]进行匹配括号中出现的数字 [数字-数字]可以匹配括号中数字包含范围内的数字,例如:[1235]可以匹配数字1235,[1-9]可以匹配除0之外的所有数字。另外,还可以使用快捷方式\\d进行匹配所有数字,\\d{n}表示匹配n个数字。
  2. 对于字母的匹配,类似数字的匹配,可以用[字母]以及[字母-字母]进行匹配。例如[abc]匹配abc,[a-z]匹配所有小写字母。
  3. 可以使用快捷方式(\\w)进行匹配所有大小写字母和所有数字,在写题目集6(7-3)我发现只用\\w是有问题的,要用\\w{4}才能匹配四位验证码,所以\\w{n}表示匹配n个字母。
  4. \\s可以匹配空白,\\b可以匹配单词的边界。
  5. 取反操作, [^a-z]表示匹配除小写字母a到z的所有字符,\\D表示匹配任何非数字字符,\\W表示匹配所有非字母、数字、下划线字符,\\S表示匹配所有非空白字符。
  6. ?表示匹配字符一次或零次。

这些正则表达式可以进行一些简单的匹配,若要进行更复杂的匹配,就需要更进一步的学习了。

题目集5(7-4)中Java集合框架应用的分析总结

这个题目属实是有点难为我了,我没有写出来。

三、踩坑心得

题目集4:

(7-2)在写这道题的时候,我写的求下N天方法中对于闰年判断部分是有问题的,只判断了第一次输入的年份是否为闰年,随着年份的增加年份是否为闰年并没有判断。

题目集5:

(7-5)在写这道题时,首先因为代码循环要做太多次运行超时了,再者修改后因为我是用day=day+n后的day去进行计算的,这导致day的值大小超过了整形最大值,值直接变成负的了。

题目集6:

(7-5)因为我是判断输入是否合法前就创建了数组来储存原始面积的,导致当输入的三个整形值加起来小于零时,数组大小小于零,导致运行出错。

将创建数组的操作放在判断输入合法性之后就可以正常运行了。

四、改进建议

题目集4(7-2)和题目集5(7-5):在求前N天的算法中,我还是一天一天的去减去求前N天的,这样属实是有些繁琐了,我想可以进行修改成减相应月份的天数来求前N天。

        public DateUtil getPreviousNDays(int n) {
            for(int i=0;i<n;i++) {
                this.getDay().dayReduction();
                while(this.getDay().getValue()<1) {
                    this.getMonth().monthReduction();
                    if(this.getMonth().getValue()<1) {
                        this.getMonth().resetMax();;
                        this.getYear().yearReduction();
                    }
                    this.getDay().setValue(mon_maxnum[this.getMonth().getValue()-1]);;
                }
                    if(this.getYear().isLeapYear()==true)
                        mon_maxnum[1] = 29;
                    else
                        mon_maxnum[1] = 28;
            }

题目集6(7-3):

在匹配学号时,我忘记了排除学号00这种情况了。

五、总结

通过这三次题目集的练习,我了解到了继承、多态、接口,学会了方法重写,抽象类以及接口的使用。这几个正则表达式练习,进一步使我加深了对正则表达式的理解和认识,也让我明白了还有许多我并不懂,并不理解的东西还等待着我去学习。

老师说Java三大支柱是封装、继承和多态,在一开始对此我并没有太多理解和感悟,但通过这几次大量接触关于这类东西的信息,我渐渐有感觉到这东西的重要性了,这对于我下一步的学习明确了方向。