第二次Blog作业
一、前言
这三次题目集的题量虽然一次比一次多,但是题目的难度有所减少,所花的时间也越来越少。总的来说,还是有所很大的收获的。话不多说,下面来分析每道题所涉及的知识点。
(1)题目集4
7-1.水文数据校验及处理
这道题类似与上次博客中的函数求导,都是对字符串进行处理,用各种关于处理字符串的函数如StringBuilder()方法接收数据,split()分割字符串,trim()去除字符串首尾的空格。同时类与类之间又有一定的关系,考察了面向对象设计的单一性原则。
7-2.日期问题面向对象设计(聚合一)
这道题结合了上次博客中的日期求前n天,求下n天等算法,重新以聚合的关系设计了Day类,Month类,Year类,DateUtil类。因为聚合是一种特殊的关联,因此该题以单向关联的方式,考察了类与类之间的相互调用。
7-3.图形继承
考察了类的继承关系(使用extends实现子类对父类的继承)以及重写方法的书写。
(2)题目集5
7-1.找出最长的单词-hebust
考察了ASCII编码的理解和寻找最大的ASCII编码值算法的使用。
7-2.合并两个有序数组为新的有序数组
考察的是数组的相关知识,合并可以用第三个数组表示,再对第三个数组进行排序处,还考察了排序算法的使用。
7-3.对整型数据排序
考察的是三种排序算法(选择排序法、冒泡排序法、插入排序法)的书写。
7-4.统计Java程序中关键词的出现次数
考察了三大集合(List、Set、Map)的使用,实现List或Set存储单列数据,Map存储双列数据,细分又涉及到了List中ArrayList和Map中TreeMap等类的使用,同时考察了对字符串进行处理(使用正则表达式判断数据,如使用split()函数分割字符串)。
7-5.日期问题面向对象设计(聚合二)
与第一次作业相似,考察了类与类之间的聚合关系,此题与日期问题面向对象设计(聚合一)版本不同的是类之间的聚合关系发生了变化,其中各个类之中的方法等没有发生多大变化。
(3)题目集6
7-1.正则表达式训练-QQ号校验、7-3.正则表达式训练-验证码校验、7-4.正则表达式训练-学号校验
此三题都是考察了正则表达式的使用,对数据的合法性进行检验。
7-2.字符串训练-字符排序
与第二次作业的第一题类似,都是考察了ASCII码的理解和使用。
7-5.图形继承与多态
考察了类的继承、多态性及其使用方法,考察了ArrayList常用方法及和数组的关系,从此题中深入理解面向对象的封装性、继承性及多态性的原理及用法。
7-6.实现图形接口及多态性
考察了接口的定义(interface定义新接口)和使用,从类中实现接口(implements),考察了类的封装性、继承性、多态性。
二、设计与分析
主要对①题目集4(7-2)、题目集5(7-4),②题目集4(7-3)、题目集6(7-5、7-6),③题目集6(7-1、7-3、7-4),④题目集5(7-4)进行分析。
①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
题目集4(7-2)类图:

题目集5(7-4)类图:

分析:从类图上来看,题目集4(7-2)和题目集5(7-4)的类聚合关系设计各有优缺点:
题目集4(7-2)类设计的优点是Month类可以调用Year类,Day类可以调用Month类,从而调用Year类,DateUtil类可以调用Day类从而调用Month类从而调用Year类,各个类之间都有一定的关系。缺点是调用效率慢,比如从DateUtil类调用Year类中的方法,必须先调用Day类,再调用Month类,最后才能调用Year类。
题目集5(7-4)类设计的有点是效率比较高,关系明确,比如从DateUtil类可以直接调用Year、Month、Day类中的方法。缺点是Year、Month、Day类之间没有关系,不能相互调用各自的方法。
在性能上,题目集5(7-4)更高效,因为代码运行只需要对整体部分(即DateUtil类)进行处理,运行时调用相应的部分即可,不需要像题目集4(7-2)那样层层递进。
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
题目集4(7-3)类图:

设计思路:先建立一个图形Shape父类,内含一个求面积的方法getArea(),然后用Rectangle类和Circle类继承Shape类,然后Box类和Ball类分别继承Rectangle类和Circle类,并且各个子类都再次重写了相应的求面积方法getArea()。
技术应用分析:运用了封装、继承技术,将各个对象的属性进行private封装,同时用了extends将子类Rectangle、Cirlce继承父类Shape,而Box类和Ball类又各自继承Rectangle类和Circle类。
题目集6(7-5)类图:

设计思路:这道题的设计上与题目集4(7-3)相比,略有加深,首先图形类Shape变为抽象类,方法为抽象方法,且多加了检验数据合法性方法validate()和输出面积信息方法toString(),相应的各个子类都重写了getArea()、validate()、toString()方法。同时代码中多加了排序方法sort()和求面积总和方法sum()和检验图形数据合法性的方法checkShape(),因为排序方法sort()要求用动态数组ArrayList型储存图形对象,所以就在Main类中定义排序方法sort()和求面积总和方法sum()以及验证图形数据合法性方法checkShape(),方便操作图形对象。
技术应用分析:运用了封装、继承、多态技术,将各个类的属性private封装,Rectangle类、Triangle类、Circle类继承Shape类,新建对象时运用多态的定义格式(父类类型 变量名 = new 子类类型();)。
部分技术代码展示:
//封装技术 private double radius; private double width; private double length; private double side1; private double side2; private double side3; //继承技术 class Circle extends Shape { } class Rectangle extends Shape { } class Triangle extends Shape { } //多态技术 Shape circle = new Circle(radius); Shape rectangle = new Rectangle(width,length); Shape triangle = new Triangle(side1,side2,side3);
题目集6(7-6)类图:

设计思路:新建一个接口GetArea,内含抽象方法getArea(),定义Rectangle类和Circle类实现接口并实现接口中的getArea()方法。
技术应用分析:运用了封装、多态、接口技术,用private对类中属性封装,在定义新对象时采用接口的引用实现调用类对象(多态)及类对象的方法,用interface定义新接口,implements实现接口。
部分技术代码展示:
//封装技术 private double width; private double length; private double radius; //多态技术 GetArea circle = new Circle(radius); GetArea rectangle = new Rectangle(width,length); //接口技术 interface GetArea { } class Rectangle implements GetArea { } class Circle implements GetArea { }
③对三次题目集中用到的正则表达式技术的分析总结
列出一些用到过的正则表达式语法符号:
匹配数字:\d或[0-9]
匹配非数字:\D或[^0-9]
匹配字母、数字、_:\w或[0-9A-Za-z_]
匹配非(字母、数字、_):\W或[^0-9A-Za-z_]
匹配某个特定字符:x或[x],其中x表示某个字符,如w或[w]表示匹配w字符,(注,某些字符要进行转义,比如[\\/]表示匹配/)
匹配二者之一:|
匹配0次或多次:*
匹配1次或多次:+
匹配0次或1次:?
匹配n次:{n}
匹配n到m次:{n,m}
常用的正则表达式的方法:
判断功能:public boolean matches(String regex) 分割功能:public String[] split(String regex) 替换功能:public String replaceAll(String regex,String replacement)
正则表达式技术可以解决很多检验数据性的题,如下部分应用:
//验证一个QQ号:1.号码长5-15位 2.首位不能是0 3.必须都是数字 qq.matches("[1-9][0-9]{4,14}") //验证一个验证码:四位数字或者字母(包含大小写)组成的字符串 verificationcode.matches("([\\d]|[a-zA-Z]){4}")
分析:正则表达式相比较与用简单的if判断语句,for循环语句判断数据更加方便,复杂度更低。
举例:验证一个QQ号:1. 号码长5-15位 2.首位不能是0 3.必须都是数字
//用正则表达式 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String qq = input.nextLine(); if (qq.matches("[1-9][0-9]{4,14}") == true) { System.out.println("你输入的QQ号验证成功"); } else { System.out.println("你输入的QQ号验证失败"); } } }
圈复杂度:

//不用正则表达式 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String qq = input.nextLine(); if (qq.length() >= 5 && qq.length() <= 15 && qq.charAt(0) != '0') { int i; for (i = 1;i < qq.length(); i++) { if (qq.charAt(i) >= '0' && qq.charAt(i) <= '9') { continue; } else { System.out.println("你输入的QQ号验证失败"); break; } } if (i == qq.length()) { System.out.println("你输入的QQ号验证成功"); } } else { System.out.println("你输入的QQ号验证失败"); } } }
圈复杂度:

结论:毫无疑问,用正则表达式更加简便,而且相比较与传统的用if、for循环来说,复杂度更低。
④题目集5(7-4)中Java集合框架应用的分析总结
因为题目要求使用List、Set或Map中一种或多种中的一种或多种,这里经过自行百度等方法不断去寻找相应的知识并且对三大集合List、Set、Map有了一定的了解,在本次作业中,主要采用了List接口中的ArrayList类和Map接口中的TreeMap类实现题目要求。
ArrayList特点:有序,不唯一,数组结构,非线程安全,效率高,增删慢,查找快。
//ArrayList基本用法 add(Object e) //添加一个元素 add(int idenx, Object e) //指定位置添加元素 get(int index) //获取指定位置的元素 set(int index,Object e) //替换指定位置的元素 remove(int index) //删除指定位置的元素 remove(Object e) //删除指定元素 clear() //清空数组 size() //获取数组长度
TreeMap特点:根据键值进行排序,默认是键值的升序排序
//TreeMap基本用法 put(K key,V value) //存储键值对 get(K key) //通过键获取值 replace(K key,V Value) //替换键值对 remove(K key) //通过键删除值 values() //获取所有值并存入Collection keySet() //获取所有键并存入Set
三、踩坑心得
1.关于类的创建
对于题目集4(7-2),当初写这道题的时候没有新建类的思想,导致出了个错误,DateUtil类中的属性Day对象没有建立:
解决方法:
初始化定义。
2.运算错误
基本知识还是不够牢固,在题目集4(7-3)求球的体积时,用了
(4/3) * Math.PI * Math.pow(getRadius(),3)
正确的是
(4.0/3.0) * Math.PI * Math.pow(getRadius(),3)
4.0除以3.0才是小数,而4除以3是个整数,当时关于整型和浮点型的运算忽略了这个基本知识,导致出错。
四、改进建议
1.题目集6(7-2)
这是道对字符串排序的题,我当时做的是一个一个字符根据ASCII排,圈复杂度如下:

后面发现一个Arrays.sort()可以实现字符数组的排序,改进相应代码,于是圈复杂度如下:

复杂度直接变成了1,说明这个方法比较好。
五、总结
这三次题目集虽然收获的感触没前三次的深刻,但还是有不少收获的。
关于类的概念,这三次题目集让我深刻的认识了类的三大特性(封装、继承、多态),也认识了类的几种关系(继承、聚合、实现),补充了前三次题目集对类不熟悉的地方。这三次题目集对于数据的合法性用正则表达式比较迅速高效,说明正则表达式在对这方面还是有不小的作用的。
关于新知识点的发现,trim()方法可以处理字符串首尾的空格,contains()方法可以判断字符串是否包含某段字符串。三大集合List,Set,Map有所差异,其中List和Set是存储单列数据的集合,且List可以有重复元素,Set不可以有重复元素,Map是存储双列数据的集合,键不可以重复,值可以重复。各个集合中又有各种类,各有特点。
关于排序算法,题目集5(7-3)涉及了基本的三种排序方法(选择、冒泡、插入),经过现在的书写,差不多能够掌握这三种排序方法的应用了。
关于作业,我觉得应该加大点对新的基础知识的应用,比如这次的三个集合的应用,每道题都应该要涉及一些前面题目不曾出现过的知识点,这样才会有很大的收获。


浙公网安备 33010602011771号