OOP作业总结
Posted impJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OOP作业总结相关的知识,希望对你有一定的参考价值。
关于OOP第三阶段的作业总结
阅读提示:本文目录导航,PC端页面位于文章右侧,移动端点击文章标题右侧小图标,需下滑后(顶部图片消失)目录才完全显示,可根据目录跳转文章位置。
一、前言
题目集七
- 知识点: 类的继承、多态性使用方法以及接口的应用。
- 题量: 较小
- 难度:
\\( \\begin{split} &7-1 \\quad ★★✩✩✩ \\\\&7-2 \\quad ★★✩✩✩ \\end{split} \\)
题目集八
- 知识点: 设计模式的具体运用。
- 题量: 较小
- 难度:
\\( \\begin{split} &7-1 \\quad ★★★✩✩ \\end{split} \\)
题目集九
- 知识点: 设计模式的具体运用。
- 题量: 较小
- 难度:
\\( \\begin{split} &7-1 \\quad ★★★✩✩ \\end{split} \\)
二、设计与分析
(1)题目集7(7-1)、(7-2)两道题目的递进式设计分析总结
(7-1):
(7-2):
分析:
(7-1):
设计父类Shape
,圆形(Circle)
、矩形(Rectangle)
、三角形(Triangl)
及梯形(Trapezoid)
继承Shape
,实现Comparable接口
,重写CompareTo()方法
实现排序,使用ArrayList
存储对应图形。设计DealCardList
类。
@Override
public int compareTo(Card o) {
return Double.compare(o.getShape().getArea(), shape.getArea());
}
(7-2):
在7-1的基础上,依照面向对象设计的单一职责原则
,开-闭
原则,进行设计。使用ArrayList
存储对应图形,重写toString()
方法,遍历ArrayList
输出时满足格式要求。
public void cardSort() {
Collections.sort(circles);
Collections.sort(rectangles);
Collections.sort(trapezoids);
Collections.sort(triangles);
}
(2)题目集8和题目集9两道ATM机仿真题目的设计思路分析总结
题目集4(7-3):
二维图形继承三维图形,利用继承提高代码的复用性。开闭原则的体现,面向修改关闭,面向拓展开放。
题目集6(7-5):
Rectangle,Circle, Triangle
均继承自抽象类 Shape
,Shape
实现Comparable
,重写compareTo()
使三种图形可比较面积。使用ArraysList<Shape>
存储,可直接使用Collections.sort()
abstract class Shape implements Comparable<Shape> {
public abstract double getArea();
public abstract boolean validate();
@Override
public int compareTo(Shape shape) {
return Double.compare(getArea(), shape.getArea());
}
@Override
public String toString() {
return String.format("%.2f", getArea());
}
public static double areaSum(ArrayList<Shape> shapes) {
double area = 0;
for (Shape aShape : shapes) {
area += aShape.getArea();
}
return area;
}
}
题目集6(7-6):
Rectangle
、Circle
均实现GetArea
接口,不同类的相同行为。
(3)三次题目集中用到的正则表达式技术的分析总结
题目集4(7-1) 水文数据校验:
需要校验的数据大致如下:
2015/8/2 4:00|133.8400|133.070|1.11/1.21|75.780
2015/8/2 6:00|133.840|133.080|11.11/1.11|72.8a0
2015/8/2 8:00|133.830|133.070|1.11/1.11|73.890
2015/8/2 10:00|133.820|133.080|1.11/1.11|74.380
exit
设计思路:
String[] singleDataList = data.split("\\\\|");
先把每行数据根据|
分割, 如果不能分割出5份(singDataList.length != 5
)则属于Wrong Format
。分割完成后,再对分割出的5部分单独校验。
1.日期
"[1-9][0-9]{0,3}/([1-9]|1[0-2])/([1-9]|[1-2][0-9]|3[0-1])\\\\s((1?[02468])|(2[02]))\\\\:00"
正则表达式可拆分编写,太长不利于维护,查错。
以上并未校验闰年2月情况太多不适合用正则表达式,借助日期合法校验类。
public static boolean checkDay(String str) {
//得 - 分割
String ss = str.replaceAll("/", "-");
ss = ss +":00";
SimpleDateFormat sd = new SimpleDateForma("yyyy-MM-dd HH:mm:ss");//括号内为日期格式,y代表份,M代表年份中的月份(为避免与小时中的分钟数m冲突,处用M),d代表月份中的天数
try {
sd.setLenient(false);//此处指定日期/时间解析是不严格,在true是不严格,false时为严格
sd.parse(ss);//从给定字符串的开始解析文本,以生一个日期
} catch (Exception e) {
return false;
}
return true;
}
2.水位,流量
"[1-9][0-9]{0,2}(\\\\.[0-9]{1,3})?"
3.开度
"[1-9]\\\\.([0-9]{2})\\\\s*/\\\\s*[1-9]\\\\.([0-9]{2})"
题目集5(7-4)统计Java程序中关键词的出现次数:
1.去除空格
StringBuilder check = new StringBuilder(all.toString().replaceAll("\\\\s+", ""));
2.处理""
str = str.replaceAll("\\"(.*)\\"", " ");
3.处理注释
StringBuilder(all.toString().replaceAll("/\\\\*(.*)\\\\*/", " ")); all = new StringBuilder(all.toString().replaceAll("\\\\[(.*)\\\\]", " "));
4.处理非字母数字字符
StringBuilder(all.toString().replaceAll("[^a-zA-Z0-9]", " "));
题目集6(7-1)QQ号校验:
if (s.matches("[1-9][0-9]{4,14}"))
题目集6(7-3)验证码校验:
if (s.matches("[0-9a-zA-Z]{4}"))
题目集6(7-4)学号校验:
if (s.matches("2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3][0-9]|40)"))
(4)题目集5(7-4)中Java集合框架应用的分析总结
先将所有关键字存入List
List<String> kewWordList = Arrays.asList("abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const",
"continue", "default", "do", "double", "else", "enum", "extends", "false", "final", "finally",
"float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long",
"native", "new", "null", "package", "private", "protected", "public", "return", "short", "static",
"strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try",
"void", "volatile", "while");
遍历分解后的文本,使用HashMap
,关键字作为key
,数量作为value
建立映射关系,若单词在List
中存在,则对应的value++
。
Map<String, Integer> ans = new HashMap<>();
String[] singleWordList = all.toString().split("\\\\s+");
for (String keyWord : kewWordList) {
ans.put(keyWord, 0);
}
for (String singleWord : singleWordList) {
if (kewWordList.contains(singleWord)) {
ans.replace(singleWord, ans.get(singleWord) + 1);
}
}
使用replace()
来更新key
对应的value
。
三、踩坑心得
题目集4(7-1) 水文数据校验:
1.日期合法性考虑不完善,正则表达式未考虑闰年2月和30天,31天的月份。
使用checkDay()
对日期进行二次校验。
题目集5(7-4)统计Java程序中关键词的出现次数:
1.未考虑\\* *\\注释方法。
2.据说字符数超过800之后的部分关键词不计入才得分。(测试数据又有问题????)
题目集5(7-5)日期问题面向对象设计(聚合二):
求前n天,后n天用 \\(O(n)\\) 的求法超时了,一次应该+/-一个月或一年。
四、改进建议
题目集5(7-5)日期问题面向对象设计(聚合二),判断是否满月,减去当月的天数,复杂度任很高,判断满年可继续降低时间复杂度。
五、总结
- 学到了什么: 通过本阶段的学习,进一步掌握了正则表达式的使用。进一步了解了封装,继承,多态,接口,抽象类。
- 进一步学习: 七大设计原则的实际体现,体会其优点。
- 课程建议及意见: 课程自由度高,给学生充分的自学时间,作业循序渐进,梯度适中,无需要改进的地方。
但PTA作业的 测试数据反复出锅,麻烦修正一下。
以上是关于OOP作业总结的主要内容,如果未能解决你的问题,请参考以下文章