软件工程实践第二次作业

221900324-吴苏谊宝 学生 2022-03-05 01:04:07
这个作业属于哪个课程软件工程实践2022年春-F班
这个作业要求在哪里软件工程实践第二次作业
这个作业的目标完成对冬奥会的赛事数据的爬取,并实现一个能够对国家排名及奖牌个数统计的控制台程序。
其他参考文献

目录

  • 软件工程实践第二次作业
  • 1. Gitcode项目地址
  • 2. PSP表格
  • 3. 解题思路描述
  • 3.1 需求分析
  • 3.2 获取需要的json数据
  • 3.3 解析json数据
  • 3.4 文件读取,分析与文件输出
  • 4. 接口设计和实现过程
  • 4.1 OlympicSearch.java
  • 4.2 Lib.java
  • 4.3 OlympicJsonString.java
  • 5. 关键代码展示
  • 5.1 解析json数据
  • 5.2 文件的读取,分析与输出
  • 6. 性能改进
  • 7. 单元测试
  • 7.1 测试用例
  • 7.2测试预期结果
  • 7.3测试结果
  • 7.4 覆盖率
  • 8. 异常处理
  • 9. 心得体会

软件工程实践第二次作业

1. Gitcode项目地址

项目地址:https://gitcode.net/m0_57984482/personalproject-java/-/tree/master/

2. PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划
• Estimate• 估计这个任务需要多少时间1510
Development开发
• Analysis• 需求分析 (包括学习新技术)180135
• Design Spec• 生成设计文档4515
•Design Review• 设计复审155
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)105
• Design• 具体设计60120
• Coding• 具体编码180300
• Code Review• 代码复审3020
• Test• 测试(自我测试,修改代码,提交修改)180240
Reporting报告
• Test Report• 测试报告3020
• Size Measurement• 计算工作量3020
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划4560
合计820950

3. 解题思路描述

3.1 需求分析

  1. 获取需要的json数据
  2. 解析json数据
  3. 文件读取,分析与文件输出

3.2 获取需要的json数据

  1. 在东奥专栏的客户端使用浏览器调试工具对json数据进行手动获取并保存。

3.3 解析json数据

  1. 使用阿里的fastjson进行解析。

3.4 文件读取,分析与文件输出

  1. 采用BufferedReader进行行读取
  2. 采用BufferedWriter进行文件写入

4. 接口设计和实现过程

接口设计

4.1 OlympicSearch.java

public class OlympicSearch {
    public static void main(String[] args) {
    }
}

4.2 Lib.java

public class Lib {
    public static String printOlympicTotal () {
    }
    public static String printOlympicSchedule (String schedule) {
    }
    public static void ioFile (String inputPath,String outputPath) {
    }
}

4.3 OlympicJsonString.java

public class OlympicJsonString {
}

5. 关键代码展示

5.1 解析json数据

        //解析
        OlympicJsonString olympicJsonString = new OlympicJsonString();
        JSONObject jsonObject = JSONObject.parseObject(olympicJsonString.getTotal());
        String data = jsonObject.getString("data");
        JSONObject jsonObject1 = JSONObject.parseObject(data);
        JSONArray jsonArray = jsonObject1.getJSONArray("medalsList");

        //获取并格式化输出
        for (int i=0;i<jsonArray.size();i++) {
            JSONObject jsonObject2 = jsonArray.getJSONObject(i);
            String rank = jsonObject2.getString("rank");
            String countryid = jsonObject2.getString("countryid");
            String gold = jsonObject2.getString("gold");
            String silver = jsonObject2.getString("silver");
            String bronze = jsonObject2.getString("bronze");
            String total = jsonObject2.getString("count");
            totalString = totalString +
                            "rank" + rank + ":" + countryid + "\n" +
                            "gold:" + gold + "\n" +
                            "silver:" + silver + "\n" +
                            "bronze:" + bronze + "\n" +
                            "total:" + total + "\n" +
                            "-----";
            if (i+1<jsonArray.size()) {
                totalString = totalString + "\n";
            }
        }

5.2 文件的读取,分析与输出

        try {
            File inputFile = new File(inputPath);
            File outputFile = new File(outputPath);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), "UTF-8"));
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8"));
            str = bufferedReader.readLine();
            while (true) {
                str = str.trim();
                //total
                if (str.equals("total")) {
                    bufferedWriter.append(printOlympicTotal());
                }
                //schedule
                else if (str.length()<13) {
                    bufferedWriter.append(wrong);
                }
                else if (str.indexOf("schedule")!=-1) {
                    String mid = "";
                    mid = mid + str.charAt(8);
                    //符合格式
                    if (mid.equals(" ")) {
                        str = str.replaceAll(" ", "");
                        String date = "";
                        date = date + str.charAt(8) + str.charAt(9) + str.charAt(10) + str.charAt(11);
                        if (date.equals("0202") || date.equals("0203") || date.equals("0204") || date.equals("0205") ||
                            date.equals("0206") || date.equals("0207") || date.equals("0208") || date.equals("0209") ||
                            date.equals("0210") || date.equals("0211") || date.equals("0212") || date.equals("0213") ||
                            date.equals("0214") || date.equals("0215") || date.equals("0216") || date.equals("0217") ||
                            date.equals("0218") || date.equals("0219") || date.equals("0220")) {
                            bufferedWriter.append(printOlympicSchedule(date));
                        }
                        else {
                            bufferedWriter.append(outDate);
                        }
                    }
                    //不符合格式
                    else {
                        bufferedWriter.append(wrong);
                    }
                }
                //wrong
                else {
                    bufferedWriter.append(wrong);
                }
                //循环条件
                if ((str = bufferedReader.readLine()) == null) {
                    break;
                }
                else {
                    bufferedWriter.append("\n");
                }
            }
            bufferedReader.close();
            bufferedWriter.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }

6. 性能改进

  1. 由于数据量较小,可以将需要的json数据直接批量处理,在BEJSON压缩后存入OlympicJsonString类,消除对同一Json文件多次读取的情况。

    性能改进

7. 单元测试

7.1 测试用例

  total
to tal
 totol
sche dule 02 16
  schedule
 schedu
  schedule 0222
  schedule 0202
schedule 0203
schedule 0204
schedule 0205
  schedule 0206
schedule 0207
schedule 0208
  schedule 0209
schedule 0210
schedule 0211
schedule 0212
schedule 0213
schedule 0214
schedule 0215
schedule 0216
schedule 0217
schedule 0218
schedule 0219
schedule 0220

7.2测试预期结果

1.总榜数据
2.ERROR
3.ERROR
4.ERROR
5.ERROR
6.ERROR
7.N/A
8.0202赛程数据
9.0203赛程数据
10.0204赛程数据
11.0205赛程数据
12.0206赛程数据
13.0207赛程数据
14.0208赛程数据
15.0209赛程数据
16.0210赛程数据
17.0211赛程数据
18.0212赛程数据
19.0213赛程数据
20.0214赛程数据
21.0215赛程数据
22.0216赛程数据
23.0217赛程数据
24.0218赛程数据
25.0219赛程数据
26.0220赛程数据

7.3测试结果

//符合预期,全部通过
1.总榜数据
2.ERROR
3.ERROR
4.ERROR
5.ERROR
6.ERROR
7.N/A
8.0202赛程数据
9.0203赛程数据
10.0204赛程数据
11.0205赛程数据
12.0206赛程数据
13.0207赛程数据
14.0208赛程数据
15.0209赛程数据
16.0210赛程数据
17.0211赛程数据
18.0212赛程数据
19.0213赛程数据
20.0214赛程数据
21.0215赛程数据
22.0216赛程数据
23.0217赛程数据
24.0218赛程数据
25.0219赛程数据
26.0220赛程数据

7.4 覆盖率

覆盖率

8. 异常处理

  1. 对文件的打开与读写进行处理。

9. 心得体会

  通过这次实践,复习巩固了使用Java字符串操作与文件操作,了解了有关爬虫方面的知识,但没有亲手实践。学会了使用了fastJson解析Json,学习使用Git进行版本控制管理并亲手实践,并培养锻炼自己的自学能力。一次个人实践,多方面的实践锻炼,为之后的团队合作编程打下基础。

...全文
77 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wake_lie 助教 2022-03-12
  • 打赏
  • 举报
回复

性能改进最好贴上代码性能分析工具的截图,另外文件读取的异常处理部分还需要改进。

103

社区成员

发帖
与我相关
我的任务
社区描述
福州大学-计算机与大数据学院-傅明建
软件工程 高校
社区管理员
  • Mingjian_Fu
  • Lyu-
  • Wake_lie
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

本次作业截止时间为2022-02-18 23:59:59,请未完成的同学抓紧时间,加入社区后的同学要按照“学号-姓名”的格式修改社区昵称。

试试用AI创作助手写篇文章吧