oop第二次博客总结

一、前言

     ㈠第四次题目集题量、难度、知识点情况

       ① 知识点总结情况:

         7-1主要考察的是正则表达式的应用以及对字符串类的应用及数据计算处理

         7-2主要考察的是题目集三中7-2的定义日期类的一个进阶版本 这里考察了类间关系-聚合的应用

         7-3主要是继承的关系 重写方法的应用 以及代码可复用性的初步体验 在做题的过程中也能让我们自主去观察构造法则链以及对保留小数格式           方法的使用 

       ② 题量:

         总体来说题量并不大 由于在7-2和7-3上老师都有给出相应的思路提示信息 节省了大部分时间 由于7-1的正则表达式上可能会在一定程度上增加题目的题量

     难度:

         7-1对于我来讲难度是很大的 对于复杂的正则表达式我没用办法进行匹配 头绪较难理清

         7-2的难度在于聚合关系的应用 传参那里我耗费了大量时间 但是同样老师给出了类图参考也在一定程度上减低了难度

         7-3难度半颗星 因为题目本身简单而且还给了大量提示思路 所以基本没什么难度

     ㈡第五次题目集题量、难度、知识点情况

      ①知识点总结情况:

         7-1主要考查的是字符串的应用

         7-1 7-2 7-3主要考查的是数组的应用 各种排序方法的练习(对选择排序 冒泡排序的复习以及对插入排序的学习)

         7-4主要考察的是正则表达式的应用 以及对字符串操作的应用 接口的应用

         7-5主要考察的是与题目集四中7-2虽同属于聚合关系 但聚合关系的使用不完全一致

       ②题量:

         本次虽然题目数量增大 但题目难度却降低了 所以题量不算大

       ③难度:


         本次题目难度主要集中于正则表达式的检验检验哪里 还有如何将他们筛选出来 筛选出来以后如何放入字符串数组来遍历让map发挥作用

    ㈢第五次题目集题量、难度、知识点情况

        ①知识点总结情况: 

          7-1、7-3、7-4主要考察简单正则表达式的应用

          7-2考察字符排序 也属于简单字符串的操作 主要是将字符串中字符传入数组在进行字符串的排序

          7-5主要考查了collections和Arrays的操作以及多态性封装性抽象类的使用 

          7-6主要考察了类的封装性多态性和接口的应用

       ②题量:

          虽然题目数量多 但没有难度 所以题量不是很大

       ③难度:

          难度指数一颗星 正则表达式考察比较简单 好多题为同类型题目 多态性和接口的应用也是给了提示所以没什么难度

二、设计与分析:

       ①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较

          先对类图进行分析:

 

 

                                                                                     7-2图

 

                                                           7-5图

由类图可知 两者采用的都是聚合关系 7-2采用的是类似于套娃式的聚合关系,7-5采用的是多个类聚合于一个类,聚合关系描述类之间存在整体和部分之间的关系,7-2的聚合关系在业务类当中进行了天数的计算,而计算不同的年,月,日就交给了不同的类去使用,实现了类的单一职责原则,dateutil类只处理了如何计算天数,但在类间调用、类间传参上很麻烦,需要一步一步去调用  7-5虽然没有实现单一职责原则,但简化了类间关系的调用 以下是两个的圈复杂度 因为这两道题只是聚合关系的不同 所有方法都是相似的 但圈复杂度很明显套娃式的聚合关系要略低于7-5 所以我个人认为在7-2采用的聚合方式可能在一定程度上降低圈复杂度 提高代码的维护性 不过在使用过程中较为繁琐

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

 如图所示以下是题目集7-3的类图

 

 由类间关系图可知  他们属于继承关系 父类定义子类构建 Rectangle类与Circle类同继承于Shape类 他们继承了父类当中getArea()的方法,Ball和Box又分别继承自Circle类和Rectangle类 Ball类继承了父类的属性及其方法 又增添了一个新的方法求体积 Box类除了继承了父类的属性和方法也定义了一个新的求体积的方法 这样对getArea()的覆写提高了代码的可维护性和可复用性 他运用了封装 封装了属性 保护它不被其它的函数意外的修改 同时protected和private作用类似 但private不可继承 因此如果子类想要继承父类的属性 一定要将父类属性中private改为protected 继承和多态密不可分 

 

如图所示以下是题目集7-5的类图

 

 由图可知 Circle类、Rectangle类和Triangle类都继承于一个父类Shape类 Shape类属于抽象类 是属于抽象类定义实体类 所以抽象类不能创建对象(即使没有抽象方法),抽象类定义的成员变量和方法标明其子类必须具有这些成员变量和该方法,那么抽象类的多个子类可以继承这些方法,也可以重写父类的方法 那么在本题当中 我虽然我没有用到toString的方法 但是也要重写父类的方法 抽象类当中并没有定义变量 所以子类中的变量都是私有的 实体类继承了抽象类的方法只需要进行覆写即可

 

 

如图所示以下是题目集7-6的类图

本题属于接口定义实现类构建 我定义一个接口 一个接口只有方法的特征没有方法的实现 Java接口必须通过类来实现它的抽象方法 通过implements来实现  可以有不止一个实现类 那么对接口类方法进行重载 一样的 在类内的属性均为私有属性 实现了封装 我只需要设计一个获得面积的接口 实现类Rectangle Circle进行方法的重载 在主函数当中进行多态的使用(也要注意多态的使用) 就可以提高代码的可复用性 也便于代码的维护 

 

(在题目中所遇到的问题与一些自己的思路我会在采坑心得中进行记录)

 

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

   本次正则表达式按照我心目中的由简入难进行分析

   一、简单:题目集6当中的几个正则表达式属于简单的正则表达式 这里考取了几个知识点

                     1、如何限定输入字符串的长度(QQ号考点)

                     2、如何对输入字符串的种类进行检测 就是各个正则字符所代表的含义

                     3、“|”的含义考察(在学号和验证码考察占比比较重)

                     4、超过10的数字如何用正则表达式进行校验(学号1-40)

 

 二、中等:题目集5当中找出关键词的正则表达式

                    1、本题的正则表达式的表达式并不是非常难当然也不简单 关键是思考检测什么才能将该剔除的关键字剔除该统计的关键字进行统计 所以最后我所选取的方法是对注释等进行正则表达式的匹配 因此正则表达式主要考查的是一些特殊字符的匹配 和多个不确定字符该如何匹配  

 

 三、困难:水文数据的检测

                    1、主要是考察时间日期的匹配 以及奇偶性的匹配 在时间日期的匹配很有难度 首先要考虑年月日的合理性 还有时间输入的合理性 年月日要考虑是否为闰年 考虑2月份天数 以及不满十天的输入格式 年份输入格式很复杂 稍有一步步细心可能就白匹配了 

                     2、考察一些特殊字符的匹配 理解类似^ , $的含义以及使用位置便于使用与操作

本次正则表达总结

                    1、写正则表达式之前应该思路清晰 这是最重要的

                    2、每一种可能输入的情况都要考虑到 选择合适的正则表达式进行匹配 例如qq号就要找正确输入 而关键字查找就要匹配注释并将其删掉 

                    3、正则表达式本身并不难 复杂的是要检测的数据的匹配 匹配在一定程度上增加了正则表达式的难度 要熟练运用各种符号 操作符 在一些特定的输入方式中用最简洁的操作符来进行匹配

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

                List、Set或Map中选择任意一种 我所选择的是Map 之所以选择Map是因为Set当中不允许有重复元素 而输入的提示又是Map 而且Map可以HashMap的值是没有顺序的,他是按照key的HashCode来实现的,就是根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。而且我进行筛选的时候无法确保是不是一个关键字只出现一次 所以我所选择的集合框架时map 通过值的增加 最后只需要统计值是多少就可以知道关键字的输出个数

 

三、采坑心得:

            1、题目集四7-1:

                  我并没有写出这道题 但是我发现他的日期时间匹配与题目集六7-4学号1-40的匹配方式很相似

            2、题目集六7-5:

                  ①:本题在获取面积的时候遇到了一些问题 我一直以为ArrayList是一种数组 那么进行求和也是一个for循环就可以实现 但是 在用for循环时 我的ArrayList数组只能加上第一个数字 然后就会跳出循环 报错 debug后发现循环无法实现 所以我通过调用集合的Iterator()方法,获取指向集合开头的迭代器 建立一个hasNext()方法调用循环 就可以进行方法的计算 那么在计算当中 我想过将两个while循环放在一起 即将逐个输出与计算总面积一同进行 但不知道什么原因报错 所以我分成两个循环进行输出和计算 但是无法用同一个迭代器进行迭代 这样也无法进行输出和计算 所以我建立了两个迭代器

1         Iterator<Double> it = arraylist.iterator();
2         Iterator<Double> it1 = arraylist.iterator();
3         while(it.hasNext()) {
4             System.out.print( df.format(it.next()) + " ");
5         }
6         while(it1.hasNext()) {
7             sum = sum + it1.next();
8         }

                 ②:在输出时要求输出小数点后两位 在我使用arrayList后 我采用了String Format进行小数点后两位输出 但是报错 所以我在网上学习了另一种方法df.format(),但是 他需要规定一种格式 所以我采用了这种格式

1 DecimalFormat df = new DecimalFormat("#0.00");

                 ③:在输出过程中 我在sum of area始终没办法换行输出 于是我采用了换行字符“\n" 想要将其进行换行转化 但是在双引号当中加入换行字符时用println并不识别换行字符 所以我将println换成printf进行输出 因此可以进行换行输出

1 System.out.printf( "\nSum of area:"+ df.format(sum));

                ④:在测试结果过程中 即使我按照参考格式输入正确格式 但是代码并不会进行正常运行 没有任何输出 经过debug发现我是因为for循环输入数字时如果输入不正确的时候我采用的是break方法跳出循环 但是break跳出循环并不能达到我的目的 因此我在网上查阅了资料以后 将break换成了System.exit(0);即可进行接下来的计算 也能运行出正确结果 下面是所举的例子其他两种情况也是如此

1 if(triangle.validate()==false) {
2                     System.out.println("Wrong Format");
3                     System.exit(0);
4                 }

 

                 ⑤:在计算结果的过程中 当我输入数字不合理时不会直接输出Wrong Format而是输出所有输出语句在输出wrong format 是因为我理由判断的不合理 我先将其进行计算的判断条件进行限制如图所示

                  图形数均为0、无圆对象测试 无矩形对象测试 无三角形对象测试测试点均无法通过 而且无法通过的原因与改正前是一样的 并且我发现 如果加上这个限定条件 如果我没有三角形矩形圆形程序无法进行计算 于是我进行了第二次更改

               发现这样问题还是没有得到解决 于是我对限制条件的位置进行了改变 只有在a,b,c的输入均大于等于0才进行后面的输入数据以及计算输出结果操作 否则就直接输出WrongFormat 这次虽然问题得到解决 但圆类的非法测试点并没有通过 于是我将输入把半径的限定条件改为大于等于0 虽然我到现在也没想明白为什么可以半径为0还能成为一个圆 但是答案通过了。

 

 

              3、题目集六7-6:

                    本题目唯一的采坑心得就是 上课的时候偷懒没有跟着老师一起写代码导致使用接口的引用记忆模糊 靠着零七八碎的记忆拼对的 下次一定一直跟着老师敲代码 不能只听 随堂代码笔记才重要

 

               4、题目集六7-2:

                     本题一共需要总结的有两点  :1、最开始的想法是错误的 在对字符串进行比较的时候 我最开始想的是把字符全部转化成阿斯克码值放                                                                             入数组采用任意一种排序方法进行比较 但是不知道如何转化阿斯克码值 所以查阅了大量资料还是没                                                                             搞清楚一些非法字符的转化 所以浪费了大量的时间后来清楚了可以直接进行比较

                                                                      2、字符串可以直接转化为字符串数组 不需要进行其他操作选择排序方法就可以直接排序

1 str = input.nextLine();
2 char []c = new char[str.length()];
3 c=str.toCharArray();

                 

 

 

                5、题目集六7-3:

                     在进行正则表达式匹配时 我想将大小写字母一起匹配[a,Z]这样 但是这种方法无法匹配成功 于是我改正成了"([A-Z]|[a-z]|\\d){4}"大写对大写小写对小写 

 

               6、题目集六7-4:

                     1、学会 “ | ” 的使用。

                     2、大于十的数字如何匹配 在匹配40这里卡了好久 (0[1,9]|([1-3]\\d)|40)

 

               7、题目集四7-2:

                     1、输入年月日的越界测试无法通过 但是明明有日期检测判断 但是可能是因为代码不严谨的原因 所以我后续进行了改正

                          

                              这只是举了其中一个月份进行测试 其余的方法也和这个一样 

                        2、当我进行输入时 我将所有输入都放在一起 导致求前n天和后n天无法进行 后来我知道 如果你把所有输入都放在一起 如果你不输入完 计算机就不会进                                  行下一步 所以后来我将选择n的输入和两年间隔需要第二个年月日放在case里面进行输入

                                 改正后     放入case3之中

                     3、在我进行计算时 进行选项3的计算 我只要算一天就会停止计算 查找后发现再比较函数之中 我多了个= 删去后 部分答案正确了 但是我的计算间隔日期的思路是如果比较的时候 第一个比第二个大就进行交换在计算 否则就直接计算 但是在真正计算时 总会有一个计算超时的原因 后来发现在交换那一步时 我让大的年月日增加天数 就永远不可能和小的年月日相等了 改正后答案正确 

               8、题目集五7-5:

                    本题和上一个的区别在于聚合关系不同 所以方法都大同小异但是在计算时我遇到了两个问题

                         1、答案没计算正确 原因:case后面没加break;

                         2、运行超时 :主要是整数型最大值没有办法通过

                                                  将n的int型改为long 这个算是取巧通过了吧 但是我之前想先判断是否是闰年在一年一年的去加如果闰年就加366不是就加365 但是改了循                                                     环规则一样没有通过所以我只能将int改为long

              9、题目集五7-1:

                    找出最大单词 一开始我只是进行了字符串长度的比较然后无法进行比较也无法进行计算 然后我发现了一个东西 就是str.split(" ")/删除字符串中空格并放入一个新数组 这样极大的方便了我计算与思路。

 

   四、改进建议

          1、减少if else语句的使用 尽量转化成java的思维

         2、自己在写代码时 有时代码过于乱 就是除了自己谁也没办法读懂我的代码 希望能精简代码 

         3、加强对list、group、字符串的一些操作、以及加强对一些概念的理解 类间关系应该如何去应用

         4、提高自己逻辑性和严谨性 每次的代码都要因为不够严谨而出错

    五、总结

           1、通过本月的训练首先学会的是 聚合关系 虽然现在对类设计概念很模糊 但是通过日期类的进阶训练感觉对类间关系的理解也更深刻一些

          2、继承与多态的使用 在本月练习当中首先我们对多态的理解会更深刻一些 所谓的“多态” 简单的理解就是对象在不同情况下的不同表现 具体体现在定义和功能两个方面 多态可以用“三个定义和两个方法”来总结 三个定义分别是父类定义子类构建 接口定义实现类构建和抽象类定义实体类构建 而两个方法分别是方法重载和方法重写 那么我们在进行继承与多态时总是离不开重载和重写 经过本月的训练也更加理解了如何进行重载和重写 

          3、接口与继承的区别:接口不能有静态代码块与构造方法但是继承可以有

                                                接口中的成员变量必须是静态不可变的 但父类不是 并且父类当中有的子类必须有 但接口则不要求

                                                一个类的直接父类是唯一的 而一个类可以实现多个接口.

                                                抽象类当中使用abstract来抽象类 而接口使用interface对方法行为进行抽象 那么抽象类中可以有实现的方法也可以没有实现的抽象方法 但是接口中没有已经实现的方法 全部是抽象方法

         4、一些正则表达式的应用 虽然复杂的正则表达式对我来说还是有一定的难度 但是简单的正则表达式我已经能够表达

         5、通过本月训练 我发现了自己有对概念知识混淆还对字符串的一些相关操作其中的方法并不熟悉 还需要进行进一步的训练与读书

         6、在写代码时候还是改不了if else语句的使用 我感觉自己就是老师嘴里的c语言思维还没有完全转换过来 希望尽快转化过来

posted @ 2021-05-01 00:11  zhyyyyy  阅读(76)  评论(0)    收藏  举报