寒假作业(2/2)— 疫情统计

寒假作业(2/2)

这个作业属于哪个课程 2020春W班
这个作业要求在哪里 作业要求
这个作业的目标 构建之法、PSP表格、Github使用、疫情统计程序...
作业正文 ....
其他参考文献 ...

一、Github仓库地址

作者仓库地址
主仓库地址

二、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 40
Estimate 估计这个任务需要多少时间 5 10
Development 开发 1200 800
Analysis 需求分析 (包括学习新技术) 180 200
Design Spec 生成设计文档 60 30
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 60 50
Design 具体设计 120 130
Coding 具体编码 240 360
Code Review 代码复审 30 60
Test 测试(自我测试,修改代码,提交修改) 120 60
Reporting 报告 30 20
Test Report 测试报告 30 20
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 30
合计 2165 1850

三、解题思路描述

  • 首先是命令行参数的识别。在CSDN上学习了相关知识:java学习之命令行参数通过命令行传递参数
  • 其次是日志的读取。学会了读取指定文件夹内所有文件的知识:JAVA基础知识之File类
  • 再次是分析日志内容的编码。因为有些偷懒,所以没有去学习JAVA的正则表达式,写了一大堆代码。后来想想,这样反而浪费了时间,也没有学到这个知识,真的是,。
  • 最后是txt文档的生成。就是先得到结果,在输出到文件。

四、设计实现过程

因为做作业的时候,时间也比较紧张了,所以并没有花心思设计几个类、几个函数。结果呢,就把代码塞到了main函数里,幸好代码量不是太多。下面就是一些示意图:
数据结构
算法流程

五、代码说明

  • 处理命令行参数

    //得到存放各类型命令行参数的ArrayList具体值
    for (int i=0;i<args.length;i++)
    {
    if (args[i].equals("-log")) {
    logList=args[++i];
    logList=logList.replace('/', '\');
    }
    else if (args[i].equals("-out")) {
    outList=args[++i];
    outList=outList.replace('/', '\');
    }
    else if (args[i].equals("-date")) {
    dateList=args[++i];
    }
    else if (args[i].equals("-type")) {
    for (int j=i+1;j<args.length;j++) {
    if (!args[j].equals("-out")&&!args[j].equals("-date")&&
    !args[j].equals("-log")&&!args[j].equals("-province"))
    {
    typeList.add(args[j]);
    }
    else
    {
    i=j-1;
    break;
    }
    }
    }
    else if (args[i].equals("-province")) {
    ...
    }
    }//获取ArrayList循环结束

  • 处理日志文件

    //处理日志中的数据
    for(String s:arr)
    {
    if (s.compareTo(dateList+".log")>0) continue;
    try
    {
    File afile = new File(logList+s);
    Scanner sc = new Scanner(afile);
    while (sc.hasNext())
    {
    String first=sc.next();
    if (first.equals("//"))
    sc.nextLine();
    else
    {
    int index=0;
    for (int i=0;i<32;i++)
    {
    if (first.equals(province[i]))
    {
    index=i;
    break;
    }
    }
    number0=1;
    numberindex=1;
    String second=sc.next();
    if (second.equals("新增"))
    {
    String third=sc.next();
    String four=sc.next();
    four=four.replace("人", "");
    int member=Integer.parseInt(four);
    if (third.equals("感染患者")) {
    number[0][0]+=member;
    number[index][0]+=member;
    }
    else {
    number0+=member;
    numberindex+=member;
    }
    }
    else if (second.equals("感染患者"))
    ...
    }
    }
    sc.close();
    }
    }

  • 将从日志文件得到的数据转化为所需数据

    //得到输出结果
    ArrayList result=new ArrayList ();
    if (provinceInt.size()==0)
    ...
    else
    {
    for (int i=0;i<32;i++)
    number i=0;
    for (int i=0;i<provinceInt.size();i++)
    number provinceInt.get(i)=1;
    if(typeInt.size()==0)
    {
    for (int i=0;i<32;i++)
    {
    if (number i==0)
    {
    continue;
    }
    String mid=province[i]+" 感染患者"+""+number[i][0]+""+"人"+" 疑似患者"+""+number i+""+"人"
    +" 治愈"+""+number i+""+"人"+" 死亡"+""+number i+""+"人\n";
    result.add(mid);
    }
    }
    else
    ...
    }
    }

六、单元测试截图和描述

由于我写代码之前没有仔细看单元测试的内容,所以把所有的代码都写到了main函数里,这就很难测试每一个代码片段了。所以写完以后,我只能修改了一下自己的代码,这样起码main函数可以得到测试结果,。
测试代码
import static org.junit.Assert.*;

import org.junit.Test;

public class InfectStatisticTest
{
@Test
public void testMain()
{
String[] test1=("list -log D:/log/ -out D:/ListOut1.txt -date 2020-01-22").split(" ");
//for(int i=0;i<test1.length;i++)
//System.out.println(test1[i]);
InfectStatistic.main(test1);
assertEquals("全国 感染患者15人 疑似患者22人 治愈2人 死亡1人\n", InfectStatistic.result.get(0));
assertEquals("福建 感染患者5人 疑似患者7人 治愈0人 死亡0人\n", InfectStatistic.result.get(1));
assertEquals("湖北 感染患者10人 疑似患者15人 治愈2人 死亡1人\n", InfectStatistic.result.get(2));

// String[] test2=("list -log D:/log/ -out D:/ListOut2.txt -date 2020-01-22 -province 福建 河北").split(" ");
// InfectStatistic.main(test2);
// assertEquals("福建 感染患者5人 疑似患者7人 治愈0人 死亡0人\n", InfectStatistic.result.get(0));
// assertEquals("河北 感染患者0人 疑似患者0人 治愈0人 死亡0人\n", InfectStatistic.result.get(1));

// String[] test3=("list -log D:/log/ -out D:/ListOut7.txt -date 2020-01-23 -type cure dead ip -province 全国 浙江 福建").split(" ");
// InfectStatistic.main(test3);
// assertEquals("全国 治愈4人 死亡3人 感染患者42人\n", InfectStatistic.result.get(0));
// assertEquals("福建 治愈1人 死亡0人 感染患者9人\n", InfectStatistic.result.get(1));
// assertEquals("浙江 治愈0人 死亡0人 感染患者0人\n", InfectStatistic.result.get(2));
}
}
三个测试结果截图
test1
test2
test3
看起来一样,。

七、单元测试覆盖率优化和性能测试,性能优化截图和描述

单元测试覆盖率
怎么说呢,因为我是直接测试main函数,所以命令行要么带province要么不带province,要么带type要么不带type,就不能一次测试把所有情况都覆盖,难搞。
此处输入图片的描述

八、代码规范的链接

https://github.com/massizhi/InfectStatistic-main/blob/master/221701141/codestyle.md

九、心路历程与收获

艰辛!做这个项目,发现自己不会的太多了。原来以为在实验室做了几个项目,自己的工程能力应该不错了,结果用到的都是自己的知识盲区。比如实验室用SVN,这里用Git,虽然都是代码管理工具,学起来也十分吃力。自己比较懒,做作业的时候距离截止时间也不多了,所以做的比较匆忙。当然了,不会的东西多,学到的就多,争取对这个项目经历能做一个详细的总结吧。收获也是挺多的,比如软件工程的初步了解、Github的使用、对自己第一次作业定的目标的资料收集、Java命令行参数的获取、Java输入输出等、构建之法、单元测试等。

十、第一次作业中技术路线图相关的5个仓库

  • 谷歌全新开源人工智能系统TensorFlow官方文档: TensorFlow官方文档
    机器学习作为人工智能的一种类型,可以让软件根据大量的数据来对未来的情况进行阐述或预判。「TensorFlow」是 Google 多年以来内部的机器学习系统。
  • 人工智能实战微信小程序demo小程序demo
    里面为很多微信小程序的demo,AI学到一定程度就可以参考demo编写自己的程序了。
  • AI-Practice-Tensorflow-NotesTensorflow笔记
    里面为人工智能实践:Tensorflow笔记 。
  • 机器学习相关教程https://github.com/MorvanZhou/tutorials

    Python 基础
    基础
    多线程 threading
    多进程 multiprocessing
    简单窗口 tkinter
    机器学习
    有趣的机器学习
    强化学习 (Reinforcement Learning)
    进化算法 (Evolutionary Algorithm) 如遗传算法等
    Tensorflow (神经网络)
    PyTorch (神经网络)
    Theano (神经网络)
    Keras (快速神经网络)
    Scikit-Learn (机器学习)
    机器学习实战
    数据处理
    Numpy & Pandas (处理数据)
    Matplotlib (绘图)
    爬虫
    其他
    Git (版本管理)
    Linux 简易教学

  • 吴恩达老师的机器学习课程个人笔记: https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes
    本课程提供了一个广泛的介绍机器学习、数据挖掘、统计模式识别的课程。主题包括:
    1、监督学习(参数/非参数算法,支持向量机,核函数,神经网络)。
    2、无监督学习(聚类,降维,推荐系统,深入学习推荐)。
    3、在机器学习的最佳实践(偏差/方差理论;在机器学习和人工智能创新过程)。

猜你喜欢

转载自www.cnblogs.com/massizhi/p/12327893.html