OO我的第二次Blog

2021/4/24 18:25:13

本文主要是介绍OO我的第二次Blog,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、 三次作业的实现

这三次的作业不再是以前的那种难度了。相对于以前来说,这三次作业的难度确定降低了许多,就正则的关系就让人想吐。在oop-4中,里面虽然只有三题,但是分值却不小,第一个就占有%50的分值,同时也是这里面难度最大的一题。这三题考察的也就是类的继承聚合的正确的使用,以及对正则表达式的使用(不过没有上次的正则难度大)。在oop-5中考察的主要还是类的聚合和正则表达式的使用,oop-6中则主要是正则表达式的使用,通过正则表达式来对各种数据有着更好的校验,同时考察了类的继承,接口等。

总的来说,这三次的作业难度比前面三次的降低了,不再是花费大把的时间最终还是什么都没有搞出来(当时的内心可以说是非常的崩溃)。这三次的作业在知识点的考察比较全面,在4,5,6这三个里面相继把新学的内容给考察进去了,在题量与难度方面也是属于比较适中的,不至于题目虽然很少,但是难度方面却大大提升了。

前面三次还并不是对Java面向对象这点有很好的理解(认为代码怎么可能还有什么面向对象这一说法),在经过这几次的作业,发现原来code也可以很好的来表示人们的正常行为,实在是让我感到震惊。

下面,就让我来对这三次的作业做个全面的分析。

二、 Design And Analysis

1. 在oop-4中,这三体题的难度还可以,就是有的题目比较的恶心,在数据处理方面还是比较的难的。在水问数据的校验及处理这题,一开始看似你难度并不是很大,但是在code时却并不是那么的轻松。就指导书来说,我们对这题还不能盲目的书写,因为每道题的要求还是不同的,甚至在每个数据的要求也是不同的,就如这题的要求:

可能一不留神就会将其中某个数据的要求缺失(有的保留两位小数,有的保留三位小数),导致测试点无法通过。先将题目的要求读懂如何再来根据这些类来书写,由于指导书依旧帮我们写好了类,对于我们来说只需要完善这些功能就可以了,这还是将题目的难度降低了,让我们在对繁杂的数据处理时有着更加清晰的思路了。对于这题,我就是将这些补充完整,正确的使用正则表达式还是可以将其解出来的。对于这题的类与类之间的关系大体如下:

这题并不需要使用到聚合,它们之间的关系主要还是组合关系。通过这样的类图关系,其实我们可以很好的理解这些类与类之间的关系,同时也是可以很好的为我们理清头绪,有时候我们可能在拿到一道题目时就是直接一顿操作,最终发现自己的思路从开始时就是错的,这样可能就浪费了我们的时间还挫折了我们的自信,毕竟自信也是非常重要的。

2. 对于题目集4(7-2)和题目集5(7-4),这两道题目都是使用聚合来写的,但是两者之间的类与类之间的聚合不一样,所以其实在运用的过程中产生的效果也就有着很大的区别了。我们都知道如果一个类有一个类的实体引用(类中的类),则它称为聚合。 聚合表示HAS-A关系。这是一种耦合度非常高的关系。举个例子,这就相当于没有母亲怎么来的你。在有你之前一定要有你母亲。在题目集4(7-2)中DateUtil HAS-A Day,Day HAS-A Month,Month HAS-A Year,就使得我们在创建对象的时候必须要通过先创建DateUtil,而且有Day才有Month,有Month才有Year,不然我们访问Day,Month,Year也就没有任何意义了,这样使得它们之间的关系是非常紧密的。而题目集5(7-4)中则有些不一样了,在这题中它们的关系是DateUtil HAS-A Day,DateUtil HAS-A Month,DateUtil HAS-A Year,这样在年月日之间的关系就不是那么的紧密了从而使得下次加入我们想添加一些新的功能时也会比较的方便了。让我们来看下两者的类图:

很明显的可以看出第二张图片展示出来它们之间的关系不再是那么的紧密了。不过在第一张图片中展示的我们可以知道这样子就使得关系十分的紧密,有着更好的私密性,不容易发生变化,而第二张图片所表示的则没有。

3. 在oop-4的第三题则主要是继承的使用。在这里我们可以了解一个东西,在《Think in java》中有这样一句话:复用代码是Java众多引人注目的功能之一。但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情。在这句话中最引人注目的是“复用代码”,尽可能的复用代码使我们程序员一直在追求的,现在我来介绍一种复用代码的方式,也是java三大特性之一---继承。

从这题我们知道,通过创建一个Shape类包含一个公有求图新面积的方法,其他的Circle,Rectangle,Ball等继承这个Shape类,我们在求它们图形的面积之时我们就不用每次都去写个方法来求这些图形的面积了,我们直接使用Shape类里面的求面积方法进行重写(因为每个图形求面积的内容是不一样的)就可以了,大大的节省了我们的时间。其实这题还不算是很好的运用了继承的好处。在题目集6(7-5)中我们可以发现,可以通过对Shape类里面的方法重写可以很好的判断数据合法性与计算,时得代码有了很好的提升。

 

 

从上面我们的介绍就可以基本了解了继承,通过使用继承我们能够非常方便地复用以前的代码,同时使代码量有了极大的减少,能够大大的提高开发的效率。

从上面讲了继承,我来描述下自己对接口的理解,本人认为类继承实现了接口就类似于子类继承父类(如有错误还望纠正),因为你继承接口的时候把方法重写了,就类似于直接季继承了父类,目前我是这样理解的(可能是我并没有很好的理解接口吧)。

而对于多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。通过多态我们就可以很好的让我们表示出用户想做什么,不会直接被固定了。在题目集6(7-6)中通过对接口和多态的使用,使得我们可以很好的表示出来我们想要求的图形的面积,

 

 

通过GetArea这个接口,使得在求面积时更加的方便了。

比较这三题来说,一开始的就只是继承方便了求面积,但是随着知识的补充,在求图形的面积时,我们通过对多态和接口的理解和使用在code时有了更加便捷的方法了。同样是求面积,但是我们在对其操作时使用不同的方法,通过很好的运用Java的特点,使得其更加体现出来它的好处。

4. 从最开始的正则表达式求导开始,我就深刻的体会到了正则表达式在我们对数据的操作时有了更好的处理。从水文数据的处理与校验我们就很好的发现了如果不使用正则那么数据的合法性的判断可能就有了几十上百的判断了,而对于正则表达式来说就是一行代码的事了。包括对QQ号码的校验,验证码的校验,学号的校验,通过正确的使用正则表达式就是一行就可以匹配出来了。例如

  • 这两行就分别校验出了要求必须是 5-15 位;
  • 0 不能开头;
  • 必须都是数字

和验证码是由四位数字或者字母(包含大小写)组成的字符串的QQ号码和验证码,想想,若是使用字符串和字符数组,这得是多么的复杂的事。

5. 在题目集5(7-4)中我们就使用到了一些Java集合框架,这题要求就是我这题运用的就是List,通过将这些关键子与数字对应起来,若找到则数量加1。

在Java中集合框架有许多,这里列出一些来:

 

 

从上图我们可以看出如是要正确的使用好这些也并不是易事,这就需要我们多多学习了。在这次的学习中,我发现若是很好的运行这些,这会使得我们在面对一些问题时有更好的解决方法。

三、  入坑心得与体会

其实说实话,在这三次的作业中,坑并不是很多(但是有的作业还是没有拿到满分)。

1. 在题目集4中,我认为坑最多的还是属于水文数据的处理与校验这题,毕竟就光题目的要求就挺多的。在每次题目一旦碰到有指导书的一般就是属于比较难的了(就算不难也比较恶心)。这题主要就是考察正则表达式的使用,说实话到现在我还是不会很好的使用正则表达式,没办法只能遇到不会的就查(嘿嘿)。我在处理这到题目的时候,就是利用分别每个类里面判断对应的数据是否合法,然后有个总的Validate来判断是否合法,之后再进行其他的操作这样思路就不会很乱了。

        for (int i = 0; i < strings.length; i++) {
            CheckDate checkDate3 = new CheckDate(strings[i], i + 1);
            if (!checkDate3.validateDate()) {
                flag3 = false;
                break;
            }
        }

题目大体的输出格式如下:

一句话,格式要求非常多。但是在经过将这些要求划分到不同的类来处理还是比较可以完整的处理好的,不过最大的坑就是一开始没有看清楚有的数据的要求,导致我在处理这些数据时产生了错误,经过同学的提醒才发现了原来是有的数据只能时是两位小数,有的只能是三位小数等。如下:

是不是非常的恶心?虽然都找到了各种各样的问题并解决了,还是有一个测试点没有通过,

我研究了一个晚上,同学也来帮忙了,还是没有通过。我的思路是2,3,4,6列有误我通过了,那是不是1,5列有误我没有解决,可是寻遍了各种数据都没有通过,最终时间截至这题的测试点也没有通过。而后面两题就没有什么难度了,主要是要看懂题目的要求就可以了。

2. 在题目集5中前面三题都没有难度,第一题利用一个.length直接获取字符串的长度然后找到最长的输出即可,第三题就是要了解到三种不同的排序方法即可(冒泡,选择,插入):

列出三种排序的代码:

//冒泡排序
for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
  for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
      if(arr[j]>arr[j+1]){
        int temp=arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=temp;
    }
  }
} 
//选择排序
 for (int i = 0; i < arr.length - 1; i++) {  //最后一个元素没必要再给它排序,因为它就是最大的
       int minIndex = i;                       //初始的时候就认为最小值索引指针在i位置,最小值就是arr[i]
       for (int j = i + 1; j < arr.length; j++) {  //在I后面[i+1,arr.length-1]区间找最小的值
             minIndex = arr[j] < arr[minIndex] ? j : minIndex;//找到就把最小值索引跟新,找不到最小值索引还在原位
        }
        int temp = arr[i];          //将i位置上的元素值和最小索引位置的元素值交换
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
}
//插入排序
int insertValue  = 0;
int insertIndex = 0 ;
for(int i = 1 ; i < arr.length ;i++) {
     insertValue  = arr[i];
     insertIndex = i -1 ;
            
    while(insertIndex >= 0 && insertValue < arr[insertIndex]) {
          arr[insertIndex + 1]  = arr[insertIndex]; // 向后移
         insertIndex -- ;
         }
        //找到插入的位置了
    if(insertIndex + 1 != i ) {
        arr[insertIndex + 1] = insertValue; 
    }
}

难度比较大的就是7-4统计关键词的字数了,这是一个比较麻烦的题目,因为一段代码里面会有各种各样的写法,要对code有一定的了解才可以很好的处理这些代码。我主要思路还是将字符串连接起来(看成是非常长的一行了)然后再来将这些单词拆开遍历统计输出。

        boolean flag = false;
        StringBuilder stringBuilder = new StringBuilder();
        while (!string.equals("exit")) {
            if (!string.equals("")) {
                flag = true;
            }
            if (string.matches("(.*)//(.*)")) {//匹配以//为注释的
                String[] strings = string.split("//");
                stringBuilder.append(strings[0]).append(" ");
            } else {
                stringBuilder.append(string).append(" ");
            }
            string = in.nextLine();
        }
        GetKeyWordsNum(stringBuilder.toString(), KeyWordsNum, KeyWords);
        if (!flag) {
            System.out.println("Wrong Format");
        }

不过在输入时要考虑注释的情况,若是以//注释的则是在输入时直接把//以及其后的内容直接删除,不然到后面会在使用正则表达式匹配的时候凡是出现了//,后面的东西直接没有,导致产生巨大的错误。考虑到了这些还是不能很好的过掉这些测试点

 

例如这个,我们发现如果是变量名包含了关键字的时候也会被统计进去(本来这个不应该被统计进去的),我添加了这几行代码:

        string=string.replace("+","hh");
        string=string.replace("-","hh");
        string=string.replace("*","hh");
        string=string.replace("/","hh");
        string=string.replace("=","hh");
        string=string.replace(">","hh");

就会发现这个测试过了,其实我发现这样在有些特殊字符时其实还是会统计进去,所以还是不严谨(但是PTA没有考察所以也直接过了)。不过还是有一个过不了,

 

试了许多的数据,由于对测试点了解的不是很清楚导致还是没有通过。

3. 在题目集6中,这次的题目难度比前面两次的都简单了点(因为这次我全部过啦!)。1,3,4考察的都是很基本的正则表达式的匹配,只要匹配正确即可通过。而第二题也是没有坑,直接利用个ASCII码值来判断并排序即可。后面两题也只是考察了基本的多态,继承和接口,只要把它们的基本知识了解即可通过,不过在求题目有的要求上还是得注意。

 

就如这个,首先就得主要要控制图形数量非法,如果非法就要输出Wrong Format,同时后面的操作就也没有必要了(因为我设置的是数组,如果还操作那么数组就是小于0也就没有任何的必要了,甚至报错),

if (CircleNum < 0 || RectangleNum < 0 || TriangleNum < 0) {
      System.out.println("Wrong Format");
        flag = false;
     }
        if (flag) {
//里面嵌入后续code
}

所以我直接设置了Flag来控制后续的操作。还得注意三角形三边的关系,不然一个三角形三边都组成不了三角形,那还能成为三角形吗?

4. 总的来说做这些题目就是要注意各种细节,毕竟细节决定成败

(这里希望一些大佬给出一些学习编程的方法)

四、   改进建议提升

(1) 这三次的大作业还是比较好的,在这三次作业中,学习到了Java的一些特点,例如继承,多态。如果说Java没有这些特点,我认为这就有失面向对象这一说法了,毕竟面向对象就应该是要很好的符合我们生活中的各种各样的使用,事物的千奇百怪。

(2)就自己目前的代码来说,我认为还是有很大的不足。面向对象这一特点我感觉这是一个非常重要的特质。在水文数据的处理时,若没有指导书的提示,我可能就会直接在一个Main类里面进行所有的操作,而这样的操作就会导致我们思路变得十分的混乱并且可能丢三落四的。在做到整型数据的排序是我立马联想到了其他的一些排序,例如桶排序等,就冒泡来说这复杂度太高了,若是数据量大的时候可能就要运行好久了。统计关键字这里就是考虑到了点数据结构了,若是对一些数据有了很好的处理,对Java的集合框架有了深层面的理解,那么在处理这样数据量较多的情况下就会有更好的解决方法

Java里面的集合框架非常的丰富,这就需要我们正确的选并使用它们了。

(3)最后的题目集里面的题目都是比较简单的,但是在有的方面还是值得非常好的改进的。就像是这些目前我们遇到的排序,目前都是考察的非常的少。虽然目前还没有学数据结构,但是还是得要多了解,就目前我们比较熟悉的冒泡,选择,插入等,其实还有这更好的排序方法,

这就需要我们自己多了解啦。

五、 写在最后的感想——总结

最后总的来说,这三次的作业还是比较满意的,虽然瑕疵还是有的,不过通过这三次的大作业,学习到了各种各样的新知识,内心还是比较满意的。通过这几个星期的学习,我发现比敲代码更重要的是写下自己学习心得以及理解(不是背代码),代码敲完可以忘,记下知识点和理解更重要。时间永远不会等待任何一个人,希望在以后的日子里,每天都是有着新的进步。最后送自己一句话:

你一定要走,走到灯火通明。——卢思浩《你要去相信,没有到不了的明天》

2021-04-24  18:00:00



这篇关于OO我的第二次Blog的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程