这个作业属于哪个课程 | 软件工程实践2022年春-F班 |
---|---|
这个作业要求在哪里 | 软件工程实践第二次作业——个人实战 |
这个作业的目标 | 完成对赛事数据的爬取,并实现一个能够对国家排名及奖牌个数统计的控制台程序。 |
其他参考文献 | CSDN |
文章目录
-
- Gitcode项目地址
- PSP表格
- 解题思路描述
-
- 数据获取
- 文件解析
- 程序构建
- 接口设计和实现过程
- 关键代码展示
- 性能改进
- 单元测试
- 异常处理
- 心得体会
Gitcode项目地址 项目地址
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
? Estimate | ? 估计这个任务需要多少时间 | 30 | 20 |
Development | 开发 | ||
? Analysis | ? 需求分析 (包括学习新技术) | 300 | 350 |
? Design Spec | ? 生成设计文档 | 5 | 5 |
? Design Review | ? 设计复审 | 10 | 20 |
? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 15 | 10 |
? Design | ? 具体设计 | 20 | 30 |
? Coding | ? 具体编码 | 300 | 400 |
? Code Review | ? 代码复审 | 60 | 40 |
? Test | ? 测试(自我测试,修改代码,提交修改) | 30 | 150 |
Reporting | 报告 | ||
? Test Repor | ? 测试报告 | 60 | 80 |
? Size Measurement | ? 计算工作量 | 15 | 20 |
? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 5 | 5 |
合计 | 850 | 1130 |
根据提供的网站,审查元素获得相应的数据,并通过转码网站进行转码,获得需要的数据。
文件解析
利用fastjson.jar的类对数据进行解析,完成对.json文件的解析。
程序构建
本次程序主要实现——输出奖牌总榜和输出每日赛程这两个基本功能,然后在进行优化。
接口设计和实现过程 程序主要进行对数据的处理和对用户指令的处理,程序主要分为两个部分一个是主类OlympicSearch和另外两个接口类schedule和Medal,主类主要进行对用户指令的处理,接口类主要是对奖牌 总榜和每日赛程这两类数据进行处理和输出。
关键代码展示 Medal类
int num = 0;
JSONObject jsonObject0 = JSON.parseObject(Total);
String data = https://www.it610.com/article/jsonObject0.get("data").toString();
JSONObject jsonObject1 = JSONObject.parseObject(data);
num =jsonObject1.getInteger("total");
String medals = jsonObject1.getString("medalsList");
JSONArray medalsList = JSONArray.parseArray(medals);
File f = new File(file);
FileOutputStream fop = new FileOutputStream(f,true);
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
for (int i = 0;
i < num;
i++) {
JSONObject jsonObject = JSONObject.parseObject( medalsList.get(i).toString());
String countryid = jsonObject.get("countryid").toString();
int rank = jsonObject.getInteger("rank");
int gold = jsonObject.getInteger("gold");
int silver = jsonObject.getInteger("silver");
int bronze = jsonObject.getInteger("bronze");
int total = jsonObject.getInteger("count");
writer.append("rank"+rank+":"+countryid+"\n");
writer.append("gold:"+gold+"\n");
writer.append("silver:"+silver+"\n");
writer.append("bronze:"+bronze+"\n");
writer.append("total:"+total+"\n");
writer.append("-----"+"\n");
}
writer.close();
fop.close();
}
schedule类与medal类相似
JSONObject jsonObject0 = JSON.parseObject(text);
jsonObject0 = (JSONObject) jsonObject0.get("data");
int total = jsonObject0.getInteger("total");
JSONArray matchList = jsonObject0.getJSONArray("matchList");
File f = new File(file);
FileOutputStream fop = new FileOutputStream(f,true);
OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
for (int i = 0;
i < total;
i++) {
JSONObject jsonObject = JSONObject.parseObject( matchList.get(i).toString());
String sport = jsonObject.getString("itemcodename");
String time = jsonObject.getString("startdatecn");
String name = jsonObject.getString("title");
String venue = jsonObject.getString("venuename");
writer.append("time:"+time.substring(11,16)+"\n");
writer.append("sport:"+sport+"\n");
writer.append("name:"+name);
if ((jsonObject.get("homename") != null) && (!jsonObject.getString("homename").equals(""))) {
writer.append(" "+jsonObject.getString("homename")+"VS"+jsonObject.getString("awayname"));
}
writer.append("\n");
writer.append("venue:"+venue+"\n");
writer.append("-----\n");
}
writer.close();
OlympicSearch类
File f = new File(file);
FileOutputStream fop = new FileOutputStream(f,true);
OutputStreamWriter writer = new OutputStreamWriter(fop, StandardCharsets.UTF_8);
String[] date = {"0202","0203", "0204","0205","0206","0207","0208","0209","0210","0211","0212","0213","0214","0215","0216","0217","0218","0219","0220"};
if (str.equals("total")) {
Medal.getMedal(file);
}
else if (str.matches("schedule (.*)")) {
if (str.length()!=13) {
writer.append("N/A\n"+"-----\n");
writer.close();
}//判后面空白的情况
else if (useLoop(date,str.substring(9,13))) {
schedule.getSchedule(file,str.substring(9,13));
}
else {
writer.append("N/A\n"+"-----\n");
writer.close();
}
}
else if (str.equals("")) {
}
else {
writer.append("Error\n"+"-----\n");
writer.close();
}
性能改进 优化了缓存,将已经输入过的文件存起来,减少了多次重复输入的时间。
单元测试 覆盖率测试
文章图片
测试用例
文章图片
文章图片
异常处理 参数错误
if (args != null && args.length == 2) {
input = args[0];
output = args[1];
}
else {
System.out.println("参数个数错误");
return;
}
心得体会 【软件工程实践第二次作业——个人实战】这次作业其实完成得挺艰难的,自己对整个项目的把握是很差的,从一开始的解题思路和实际编码都是问题重重,还是感谢同学和舍友的帮助,在我没有思路时,可以帮我找到正确的思路。整个作业完成下来,让我对完成项目的整体规划有了长足进步。最后,还是希望在未来自己的编程能力可以有所增强。
推荐阅读
- JAVA人生|程序员30岁之前年薪不到40W,再不转行都晚了()
- Java|做了6年开发,工资涨不上去,怎么办?
- github|【GitHubShare】AI开发七巧板,快速训练、部署与监控机器学习模型,清晰查看模型的各项统计数据
- 经验分享|【githubboy】技术面试题、编程设计理念、机器学习资料,助你更好的实践训练
- 学习笔记|CSS Sprites(CSS图片精灵、雪碧图)看这里就够了
- JAVA人生|全球程序员收入报告(字节跳动高级工程师以年薪274万排名第五)
- 5G网络|拓扑图带你走进Telnet命令世界(全是项目干货)
- 演武场|74cms3.0安装以及cmsSQL注入漏洞详解
- 极客前端|移动端兼容宝典大全,专治各种不适