这个作业属于哪个课程 | 2302软件工程 |
---|---|
这个作业的要求在哪里 | 软件工程第二次作业–文件读取 |
这个作业的目标 | 完成对世界游泳锦标赛相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序 |
其他参考文献 | 《构建之法》《源代码管理》 《阿里巴巴代码规范》 |
文章目录
1. gitcode项目地址
2. PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 35 |
* Estimate | 估计这个任务需要多少时间 | 20 | 25 |
Development | 开发 | 500 | 540 |
* Analysis | 需求分析 (包括学习新技术) | 120 | 150 |
* Design Spec | 生成设计文档 | 60 | 50 |
* Design Review | 设计复审 | 30 | 30 |
* Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 50 | 45 |
* Design | 具体设计 | 90 | 100 |
* Coding | 具体编码 | 300 | 320 |
* Code Review | 代码复审 | 60 | 50 |
* Test | 测试(自我测试,修改代码,提交修改) | 100 | 110 |
* Reporting | 报告 | 150 | 150 |
* Test Report | 测试报告 | 60 | 50 |
* Size Measurement | 计算工作量 | 60 | 50 |
* Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1690 | 1760 |
3. 解题思路描述
3.1 json文件的获取与解析
本次作业中我直接使用了助教提供的json文件,没有手动进行网络爬取。这里我将项目所需的所有json数据文件放到项目下,并进行了重命名以便后续的读取和解析操作。
- 对于功能一来说,我们需要获取所有运动员的信息,可以定位到athletes.json这个文件下。需要读取这个文件并解析这个文件,文件的结构如下图所示:
从json文件可以观察到,最外层是一个json数组,数组中的每个对象是每个国家的信息,其中键为CountryName对应的值是运动员的国家名称,再下一层可以看到键是Participations对应的值就是这个国家所有的参赛运动员组成的数组。对象中的PreferredFirstName键与PreferredFirstName键的值共同组成我们需要的Full Name信息。键是Gender的值对应运动员的性别,0为男,1为女,需要简单处理处理一下再输出。理清楚了文件结构和我们需要的信息后,就可以开始编码解析json数据了。
- 对于功能二来说,我们需要解析是的指令对应的json文件,如result women 1m springboard 指令,则会去加载解析项目目录src下的women_1m_springboard.json文件,该文件的结构如下:
可以观察到所有比赛 (包括初赛、半决赛、决赛) 的结果位于键为Heats的数组中,数组中是所有比赛的数据,其中键Name的值为Final的是总决赛的数据。定位到总决赛数据的对象后,可以观察到有键为Results的数组,这个数组就是总决赛的比赛结果数组。其中Rank对应的是选手的排名,FullName对应的是选手的全名,Dives对应的是得分情况的数组,数组中对象的DivePoint是单次得分情况。这些是我们需要获取并输出到文件中的数据。
在这两个功能的实现中,我使用谷歌的Gson库解析json文件,将json文件解析成json对象,然后将json对象转换成java的Bean对象,最后将java对象封装成List返回给调用者。
3.2 读取类路径下的文件
使用ClassLoader类加载器的getResourceAsStream来加载类路径下的文件,并把所有的命令以字符串集合的形式返回。
3.3 数据的封装
我在entity包下创建了Player和Result这两个实体类,分别用来封装运动员,决赛结果的信息。两个类都重写了对应的toString方法,可以输出题目要求格式的运动员和决赛结果的信息。
- 运动员类
//运动员
public class Player {
//选手全名
private String fullName;
//选手性别
private String gender;
//选手国籍
private String country;
public Player() {
}
....setter 和 getter省略
/**
* 以要求的格式重写toString方法
* @return 返回要求格式的字符串
*/
@Override
public String toString() {
return "Full Name:" + fullName + '\n'