软件工程实践第二次作业——个人实战

这个作业属于哪个课程软件工程实践2022年春-F班
这个作业要求在哪里作业要求
这个作业的目标解析JSON文件,实现一个可以统计国家奖牌数的程序
其他参考文献百度

Gitcode项目地址

好几次的修改都提交在这了:所有的修改版本
后面才发现要求提交到这gitcide项目地址:fork来的gitcode仓库有错误
但是似乎新库存在一些问题不知如何解决,所以还是用来原来自己的库。

PSP表格

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

解题思路描述

然后根据命令行的指令,读取需要处理的命令,优先判断命令的合法性,根据判断结果输出错误信息或者解析对应的数据文件,结果输出到对应的文件中。

接口设计和实现过程

类名
在这里插入图片描述

关键代码展示

处理命令的特殊情况下发生的错误

public class ProcessCommand {
    public static Map<String,String> dateMap=new HashMap<>();
    public static String HandleString(String data) throws UnsupportedEncodingException {
        init();
        String str=null;
        data=data.trim();
        String[] instruction=data.split("\\s+");
        if(instruction[0].equals("total")){
            ResolveTotal total=new ResolveTotal();
            str=total.HandleTolJson(instruction[0]);
            return str;
        }else if(instruction.length==2&&instruction[0].equals("schedule")){
            ResolveJSON schedule=new ResolveJSON();
            if (dateMap.get(instruction[1])!=null){
                str = schedule.HandleSchJson(instruction[1]);
                return str;
            }
            else{
                str="日期不在范围";
                return str;
            }
        }
        else{
            str="Error"+"\n"+"-----";
            return str;
        }
    }
    public static void init()
    {
        dateMap.put("0202","0202");
        dateMap.put("0203","0203");
        dateMap.put("0204","0204");
        dateMap.put("0205","0205");
        dateMap.put("0206","0206");
        dateMap.put("0207","0207");
        dateMap.put("0208","0208");
        dateMap.put("0209","0209");
        dateMap.put("0210","0210");
        dateMap.put("0211","0211");
        dateMap.put("0212","0212");
        dateMap.put("0213","0213");
        dateMap.put("0214","0214");
        dateMap.put("0215","0215");
        dateMap.put("0216","0216");
        dateMap.put("0217","0217");
        dateMap.put("0218","0218");
        dateMap.put("0219","0219");
        dateMap.put("0220","0220");
    }
}

解析JSON文件,大致过程类似

public class ResolveJSON {
    public String HandleSchJson(String str) throws UnsupportedEncodingException {
        InputStream inputStream =ResolveJSON.class.getResourceAsStream("/data/schedule/"+str+".json");
        if(inputStream!=null){
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            JsonParser parser = new JsonParser();
            JsonObject object = (JsonObject) parser.parse(bufferedReader);
            JsonObject data = object.get("data").getAsJsonObject();
            JsonArray list = data.get("matchList").getAsJsonArray();
            StringBuilder stringBuilder = new StringBuilder();
            Gson gson = new Gson();
            for (int i = 0; i < list.size() - 1; i++) {
                ReadSchedle schedule1 = gson.fromJson(list.get(i).getAsJsonObject(), ReadSchedle.class);
                stringBuilder.append(schedule1.toString());
                if(i!=list.size()-2){
                    stringBuilder.append("\n");
                }
            }
            return stringBuilder.toString();
        }else{
            return "N/A"+"\n"+"-----";
        }
    }
}

性能改进

用遍历Map来取代遍历文件,从而判断日期是否符合范围。
一个解析类来解析JSON后传输给保存类,分散功能,如ResolveJSON类和ReadSchedle类。

单元测试

用如下代码判断输出文件与标准文件是否内容一致

public class testfile {
    /**
     * 判断两个文件的内容是否相同,文件名要用绝对路径
     * @param fileName1 :文件1的绝对路径
     * @param fileName2 :文件2的绝对路径
     * @return 相同返回true,不相同返回false
     */
    public boolean isSameFile(String fileName1,String fileName2){
        FileInputStream fis1 = null;
        FileInputStream fis2 = null;
        try {
            fis1 = new FileInputStream(fileName1);
            fis2 = new FileInputStream(fileName2);

            int len1 = fis1.available();//返回总的字节数
            int len2 = fis2.available();

            if (len1 == len2) {//长度相同,则比较具体内容
                //建立两个字节缓冲区
                byte[] data1 = new byte[len1];
                byte[] data2 = new byte[len2];

                //分别将两个文件的内容读入缓冲区
                fis1.read(data1);
                fis2.read(data2);

                //依次比较文件中的每一个字节
                for (int i=0; i<len1; i++) {
                    //只要有一个字节不同,两个文件就不一样
                    if (data1[i] != data2[i]) {
                        System.out.println("文件内容不一样");
                        return false;
                    }
                }
                System.out.println("两个文件完全相同");
                return true;
            } else {
                //长度不一样,文件肯定不同
                return false;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {//关闭文件流,防止内存泄漏
            if (fis1 != null) {
                try {
                    fis1.close();
                } catch (IOException e) {
                    //忽略
                    e.printStackTrace();
                }
            }
            if (fis2 != null) {
                try {
                    fis2.close();
                } catch (IOException e) {
                    //忽略
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

异常处理

判断日期的范围的异常
输入输出的异常
文件读写的异常

心得体会

1、对待新知识一定要认真的学习,一个细节搞不懂就会被耽误很多时间。
2、读取文件一定要注意地址和格式。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值