这个作业属于哪个课程 | 2302软件工程 |
---|---|
这个作业要求在哪里 | 软件工程第二次作业–文件读取 |
这个作业的目标 | 完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序。 |
其他参考文献 | 《阿里巴巴Java开发手册》、《构建之法》 |
1.Gitcode项目地址
2.PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
• Estimate | • 估计这个任务需要多少时间 | 60 | 60 |
Development | 开发 | 1610 | 2025 |
• Analysis | • 需求分析 (包括学习新技术) | 180 | 360 |
• Design Spec | • 生成设计文档 | 20 | 20 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
• Design | • 具体设计 | 30 | 50 |
• Coding | • 具体编码 | 1200 | 1300 |
• Code Review | • 代码复审 | 30 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 240 |
Reporting | 报告 | 100 | 120 |
• Test Repor | • 测试报告 | 60 | 50 |
• Size Measurement | • 计算工作量 | 20 | 20 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 20 |
合计 | 1770 | 2205 |
3.解题思路描述
3.1 选择解析类库
经过对比目前常用的解析类库使用方式和学习成本,最后我选择了学习成本较低但目前功能最全且无依赖的Google的Gson,并利用JsonParser类的实例进行后续的解析。
3.2 解析json文件
3.2.1 解析运动员信息数据(AthletesData)
首先对于运动员个人信息的解析,通过json文件我们可以注意到json文件的顶层结构是一个数组(包含多个国家的对象),因此将JsonElement对象转换为JsonArray对象。然后依次创建运动员列表、获取国家名称和参与信息、遍历参与信息数组、提取并存储运动员信息。
3.2.2 解析比赛信息数据(ResultData)
比赛信息的json文件相对于运行员信息文件涵盖信息较多,于是为了便于观察每个对象在哪个数组下,我将json文件做了简化(即将主要信息提取出来观察其相对于各个数组的位置)。然后, 从一个指定的JSON文件中解析数据,并将解析出的特定信息打印到给定的BufferedWriter输出流中,即进行了设置文件路径、读取和解析JSON文件、提取JSON对象、获取比赛数据、处理每个比赛(对于每个比赛,提取其JsonObject表示)、检查比赛名称、获取比赛结果、处理每个结果、提取和存储结果信息。
3.3 从命令行参数中获取的输入和输出文件路径(DWASearch)
DWASearch程序根据从命令行参数中获取的输入和输出文件路径,对输入文件进行读取和处理,并将结果写入输出文件。即进行了参数检查、文件读取和写入、逐行处理、字符串拆分和条件判断、错误处理、结束处理。
4.接口设计和实现过程
AthletesData类: 定义了一个名为athletesPrint的方法,该方法接受两个参数:output(输出路径)和out(一个BufferedWriter对象,用于写入输出)。
ResultData类: 定义了一个名为resultDataPrint的方法,该方法接受三个参数:outPut(输出路径的一部分),path(JSON文件的名称或路径的一部分)以及out(一个BufferedWriter对象,用于写入输出)。
DWASearch类: 循环读取input.txt每行的数据,判断指令的正确性。若指令正确则调用AthletesData类的athletesPrint方法或ResultData类的resultDataPrint方法,来进行选手信息的输出或比赛结果的输出;若指令不正确,则输出N/A或Error。
**独到之处:**实现了对不同数据源的解析和处理,并将结果输出到指定文件中,具有一定的通用性和可扩展性。
5.关键代码展示
1.对players信息进行JSON解析
try {
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(new FileReader("D:\\软件工程实践\\project-java\\222100302\\src\\datas\\athletes.json"));
//将JsonElement对象转换为 JsonArray,表示国家列表。
JsonArray countries = element.getAsJsonArray();
//创建一个新的 ArrayList,用于存储 Athlete 对象。
List<Athlete> athletes = new ArrayList<>();
for (JsonElement countryElement : countries) {
JsonObject countryObject = countryElement.getAsJsonObject();
String countryName = countryObject.get("CountryName").getAsString();
JsonArray participations = countryObject.getAsJsonArray("Participations");
for (JsonElement participationElement : participations) {
//将 participationElement 转换为 JsonObject,代表一个运动员的参与信息。
JsonObject participationObject = participationElement.getAsJsonObject();
String firstName = participationObject.get("PreferredFirstName").getAsString();
String lastName = participationObject.get("PreferredLastName").getAsString();
int gender = participationObject.get("Gender").getAsInt();
athletes.add(new Athlete(countryName, firstName, lastName, gender));
}
}
2.对决赛信息进行JSON解析
OutPutPath = outPut;
String filePath = "D:/软件工程实践/project-java/222100302/src/datas/results/" + path + ".json";
try {
JsonParser parser = new JsonParser();//创建一个 JsonParser 实例,用于解析 JSON 数据。
JsonElement element = parser.parse(new FileReader(filePath))