blog2
前言
1.题目集四难度一般,题量中等和之前的题目量等同,为三道题目。三道题目分别考察了正则表达式,日期类的间关系和图形类的继承。
2.题目集五难度中等,题量略有增加,为五道题目。五道题目分别考察了字符串的处理、数组的处理、排序算法、正则表达式和日期的类间关系迭代
3.题目集六难度低,题量增加,为六道。六道题目前四道都是考察了正则表达式,第五道是图形类的继承和多态的迭代,第六道是图形的第三次迭代。
设计与分析
4-7-2和5-7-5
4-7-2
4-7-2 Source Monitor生成表内容

4-7-2 Power Designer类图

解释:圈复杂度最高是14,类间关系是组合关系,业务类是DateUtil、实体类是Day、Month和Year类。Main类复杂度过高在于对输入的信息的处理上,DateUtil类的复杂度过高是在处理日期合法上。这次题目的类的方法和题目集三的一样。这次日期类的迭代关键是类间关系的不同,即类间关系的设计区别,这次类间关系是组合关系。
心得:
1.通过细分问题,设计类间关系和方法解题。
2.组合关系是contains的关系,耦合性强,整体和部分的生存期相同。调用的时候是一级一级调用方法。
3.了解在代码中组合关系的体现。
5-7-5
5-7-5Source Monitor生成表内容

5-7-5 Power Designer类图

解释:圈复杂度最高是14,类间关系是聚集,除类间关系以外,其他都和4-7-2一样。
心得:
1.聚集关系是has的关系,耦合性较低,整体和部分的生存期不同。
3.了解的在代码层面上的聚集关系的体现。
日期类聚合设计的优劣比较
组合和聚集的主要区别是整体和部分的生存期不同。
组合的整体和部分的生存期相同。
聚集的整体和部分的生存期不同。
聚集相比于组合的优势在于聚集在部分不存在时,整体依旧是能存在的。
4-7-3、6-7-5和6-7-6
4-7-3
4-7-3 Source Monitor生成表内容

4-7-3 Power Designer类图

解释:圈复杂度最高为11,在Main类中,过高的主要原因是对输入数据的处理方面过于复杂。主要有两条继承链分别是:Ball类->Circle类->Shape类和Box类->Rectangle类->Shape类。Shape类为实体类。两条链中的方法都非常简单。
心得:
1.复写父类的方法要做标注,即@Override。
6-7-5
6-7-5 Source Monitor生成表内容

6-7-5 Power Designer类图

解释:圈复杂度最高为11,在Main类中,过高的主要原因是对输入数据的处理方面过于复杂。有三个继承类,Circle类、Rectangle类、Triangle类都继承抽象类---Shape类。
心得:
1.父类是实体类,但是子类可以是抽象类。如Shape类是抽象类,而它的父类Object类却是实体类。
2.父类是抽象类,子类如果是实体类,就必须实例化父类的抽象方法。如Rectangle类的父类--Shape类有三个抽象方法public abstract boolean validate(),public abstract double getArea(),public abstract String toString()Rectangle类中都需要写对应的方法去实例化父类的抽象方法。
3.父类是抽象类,子类没有完全实例化父类的抽象方法,那么子类必须声明为抽象类。
6-7-6
6-7-6 Source Monitor生成表内容

6-7-6 Power Designer类图

解释:圈复杂度最高为4,在Main类中,圈复杂度在10以内,程序的维护性高。Circle类,Rectangle类都继承了接口GetArea类,都实例化了接口类中的public abstract double getArea()方法。
心得:
1.接口是可以跨域不同的类的对行为的抽象。如Circle类和Rectangle类都有共同的行为getArea()。
2.接口的方法都是public abstract,接口能定义常量.如常量public static final a = 0;
三种渐进式图形继承设计的思路与技术运用
1.题目集4-7-3的继承是实体类继承实体类,题目集6-7-5的继承是实体类继承抽象类,题目集6-7-7的继承是实体类继承接口类。
2.题目集6-7-5的父类是从多个子类的高度抽象概括得出的抽象类,抽象类所跨域的是具有相似特点的类。
3.题目集6-7-6的接口是对行为的抽象。可以跨不同的类。
正则表达式总结
1.分组提取
//来源自题目集4-7-1
String regex = "([1-9]\\d{0,3})[\\/]([1-9]|1[0-2])[\\/]([1-9]\\d?)[ ]([0-9]|[12]\\d)[:]00";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(measureDateTime);
if(!m.matches()) {
return false;
}
int year = Integer.parseInt(m.group(1));
int month = Integer.parseInt(m.group(2));
int day = Integer.parseInt(m.group(3));
int hour = Integer.parseInt(m.group(4));
2.数值正则(前导不为零)
//来源自题目集4-7-1
//前导不为零
String regex = "[1-9]\\d{0,2}([.]\\d{1,3})?";
String regex = "[1-9][.]\\d{2}";
String regex = "([1-9]\\d{0,3})";
3.通配符和特殊字符
//来源自题目集4-7-1
//特殊字符要表示原来的意思要双斜杠
String regex = "(.)[.]";//第一个点是通配符,第二个是点
4.在方法中以正则作为所有或则部分参数
//来源自题目集4-7-1
Pattern p = Pattern.compile(regex);
Pattern.matches(regex,arg);//多参数正则作为第一个参数
5.正则表达式的删除和替换
//来源自题目集5-7-4
Pattern p1 = Pattern.compile("//.*");
Matcher m1 = p1.matcher(str);
str = m1.replaceAll(" ");
/**
*点模式:
*Pattern p = Pattern.compile(regex,DOTALL);
*默认情况下,此表达式不匹配行终止符。
*在dotall模式下,表达式。匹配任何字符,包括行终止符。
*/
Pattern p3 = Pattern.compile("\\/\\\\*.*\\\\*\\/",Pattern.DOTALL);
Matcher m3 = p3.matcher(str);
str = m3.replaceAll(" ");
6.杂项
//来源自题目集4-7-1
String regex = "[1-9]\\d+[ ][.][\\^]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(args);
m.find();
m.group();
m.group(1);
m.matches();
5-7-4
5-7-4
5-7-4Source Monitor生成表内容

5-7-4 Power Designer类图

解释:圈复杂度最高为5,在Main类中,圈复杂度在10以内,程序的维护性高。KeyWords类和DealString类是自己设计的类,KeyWords类的设计是为了创建关键字类,DealString类是业务类,帮助处理输入数据。其中DealString类的方法public String delet String(String str)是为了删除字符串、四则运算和注释。public List<KeyWrods> countTime(String str)是为了统计53个关键字出现的次数。
心得:
1.只要是能设计成类的,都尽量写成类。
2.模块化编程+注释。方便自己二次代码。
Java集合框架应用的分析总结
在题目集5-7-4中只使用了Collection类的List类,Map和Set均为使用但做了一定的了解。
1.List、Map、Set都直接或间接地使用迭代器遍历。
2.Map是能储存两个不同的值:键和值。两个值都是泛型需要自定义,键的值是不可重复的,值的内容是可以重复的。
3.Set的值是不可以重复的。对值可以排序。
采坑心得
1.数值超过范围。题目集5-7-5中测试点:下n天:整型数最大值测试。int 型最大值2147483647,当变量的值达到最大值时,不能再增大变量的值。
2.对数组操作非法。

不能直接把自定义的类的列表直接转换成数组。
3.变量赋值错误。在求日期的题目中,当闰年时2月改成29天,可是当平年时没有把改变了的值改成28天,还是之前闰年的2月份的值。
改进建议
1.日期类的对输入数据的处理的方法待改进,但是不过思路还是停留在把if-else语句改成switch语句,整体代码的圈复杂度不会有改变。
2.日期类中的求下n天、前n天和两日期之差的方法待改进。三种方法的实现可以直接暴力求解,完全不需要用自己的数学计算的方式求解。数学计算的方式和暴力循环求解的主要差别是:暴力求解所花的时间更长,但是数学计算的方式求解的代码不易看懂。
3.题目集4-7-1中的public HydrologicalInfo toHydrologicalInfo()方法待改进,提取字符串的处理可以通过正则表达式提取,而不是用spilt()方法分割提取转换。这样做的好处在于能简化代码,让代码更易于理解。
总结
组合和聚集
1.组合和聚集的主要区别在于整体和部分的区别。组合的耦合性强于聚集。
1.组合在代码中的体现:
//在整体B被创建的同时,部分A创建了
//B contains A
class A{}
class B {
1.
private A a = new A();
2.
private A a;
public B(){
super();
a = new A();
}
}
2.聚集在代码中的体现
//表现在代码层面,和关联关系是一致的,只能从语义级别来区分
//B has A
class A{}
class B{
private A a;
public funB1(A a){
a.listen();
}
public funB2(){
a = new A();
a.listen();
}
}
抽象类和接口
1.抽象类是对所跨域的是具有相似特点的类的抽象。
2.接口是对所跨域不同的类的对行为的抽象。
3.抽象类和接口类都是不能实例化的,但是可以作为引用声明。
4.抽象类的代码组成为属性+构造方法+抽象方法+方法
.接口的代码组成为常量+抽象方法。
代码实例:
public abstract class Shape{//访问修饰符 类修饰符 声明类 类名
public abstract double getArea();//访问修饰符 方法修饰符 返回值 方法名
}
public class Rectangle extends Shape{
private double width;
private double length;
public boolean getArea(){
return this.width * this.length;
}
}
interface GetArea {
public abstract double getArea();
}
class Circle implements GetArea{
private double radius;
public Circle() {
super();
// TODO Auto-generated constructor stub
}
@Override
public double getArea() {
return Math.PI * Math.pow(radius,2);
}
}
两者的异同
| 类型 | abstract class | Interface |
|---|---|---|
| 定义 | abstract class关键字 | Interface关键字 |
| 继承 | 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 | 接口只可以继承接口(一个或多个);子类可以实现多个接口 |
| 访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符 |
| 方法实现 | 可定义构造方法,可以有抽象方法和具体方法 | 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现 |
| 实现方式 | 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 | 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 |
| 作用 | 把相同的东西提取出来,即重用 | 为了把程序模块进行固化的契约,是为了降低偶 |
正则表达式
1.分组提取
2.数值正则(前导不为零)
3.通配符和特殊字符
4.在方法中以正则作为所有或则部分参数
5.正则表达式的删除和替换
细节在分析与设计中已经给出,这里不再赘述。
建议
1.习题集5-7-4中的第二个测试点的提示有问题,应该是提示四则运算,但是提示的却是中括号。完全不符合,让人摸不着头脑。
浙公网安备 33010602011771号