题目集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题目集上较难的题目,上课的方式我倾向于讲题目,通过例题引出基本的知识点,在实践中学习,在课上课下都可以组织同学们进行相应的题目训练,以加强我们对知识的掌握。

 

posted @ 2021-04-30 21:51  20201601  阅读(61)  评论(0)    收藏  举报