这个作业属于哪个课程 | 福大20春软工S班 |
---|---|
这个作业要求在哪里 | 软工实践寒假作业(2/2) |
这个作业的目标 | 疫情统计系统 |
作业正文 | 121沈明炜 |
其他参考文献 | 博客园、百度、CSDN |
1.我的GitHub仓库
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 120 | 90 |
Development | 开发 | 1200 | 900 |
Analysis | 需求分析 (包括学习新技术) | 60 | 40 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 | 60 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 120 | 100 |
Design | 具体设计 | 240 | 360 |
Coding | 具体编码 | 600 | 600 |
Code Review | 代码复审 | 120 | 240 |
Test | 测试(自我测试,修改代码,提交修改) | 240 | 240 |
Reporting | 报告 | 180 | 120 |
Test Repor | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 120 | 60 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 180 | 60 |
合计 | 3420 | 3010 |
3.解题思路描述
确定使用java进行开发,根据要求是读取文件然后进行统计并且输出,所以可以先进行初始,然后读取文件,接着对读取的结果进行统计,然后将统计结果输出到指定文件。
4.设计实现过程
根据流程图解决问题
5.代码说明
- 新增province类
//省份类
class Province
{
private String name; //省份名称
private int cure; //治愈人数
private int dead; //死亡人数
private int suspectedPatients; //疑似人数
private int infectionPatients; //感染人数
public Province(String n)
{
name = n;
}
//感染人数增长
public void addIp(String str)
{
str = str.substring(0, str.length()-1);
infectionPatients += Integer.parseInt(str);
}
//感染人数减少
public void removeIp(String str)
{
str = str.substring(0, str.length()-1);
infectionPatients -= Integer.parseInt(str);
}
//疑似人数增长
public void addSp(String str)
{
str = str.substring(0, str.length()-1);
suspectedPatients += Integer.parseInt(str);
}
//疑似人数减少
public void removeSp(String str)
{
str = str.substring(0, str.length()-1);
suspectedPatients -= Integer.parseInt(str);
}
//治愈人数增长
public void cure(String str)
{
str = str.substring(0, str.length()-1);
cure += Integer.parseInt(str);
infectionPatients -= Integer.parseInt(str);
}
//死亡人数增长
public void dead(String str)
{
str = str.substring(0, str.length()-1);
dead += Integer.parseInt(str);
infectionPatients -= Integer.parseInt(str);
}
//省份情况
public void output(boolean isOutput, String[] output, BufferedWriter bw) throws IOException
{
if (isOutput)
{
bw.write(name + " 感染患者 " + infectionPatients + "人 "
+ "疑似患者 " + suspectedPatients + "人 "
+ "治愈 " + cure + "人 "
+ "死亡 " + dead + "人");
bw.newLine();
}
else
{
bw.write(name);
for (int i = 0; i < 4; i ++ )
{
switch (output[i])
{
case "ip":
bw.write(" 感染患者 " + infectionPatients + "人");
break;
case "sp":
bw.write(" 疑似患者 " + suspectedPatients + "人");
break;
case "cure":
bw.write(" 治愈 " + cure + "人");
break;
case "dead":
bw.write(" 死亡 " + dead + "人");
break;
default:
break;
}
}
bw.newLine();
}
}
//全国
public void allAdd(Province p)
{
this.infectionPatients += p.infectionPatients;
this.suspectedPatients += p.suspectedPatients;
this.cure += p.cure;
this.dead += p.dead;
}
}
- 初始化命令行如-province等
//初始化
public void init()
{
for (int i = 0; i < arg.length; i ++ )
{
switch (arg[i])
{
case "-date":
date = new String(arg[i+1]);
isRead = false;
break;
case "-log":
logPath = new String(arg[i+1]);
break;
case "-out":
outputPath = new String(arg[i+1]);
break;
case "-type":
isOutput = false;
dealType(i+1);
break;
case "-province":
isOutputAll = false;
dealProvince(i+1);
default:
break;
}
}
}
//-province参数
public void dealProvince(int index)
{
while (index < arg.length)
{
switch (arg[index])
{
case "-date":
return;
case "-log":
return;
case "-out":
return;
case "-type":
return;
default:
provinces.add(arg[index]);
map.put(arg[index], null);
}
index ++ ;
}
}
- 读取文件及处理数据 deal函数处理所有的文件。
//日志文件
public void deal() throws IOException
{
String logDate;
String[] sArray;
File file = new File(logPath);
File[] tempList = file.listFiles();
if (!isRead)
{
logDate = new String(tempList[tempList.length-1].getName());
sArray = logDate.split("\.");
logDate = new String(sArray[0]);
if ((logDate.compareTo(date)) < 0)
{
isFinish = true;
System.out.println("日期超出范围!");
return;
}
}
for (int i = 0; i < tempList.length; i ++ )
{
logDate = new String(tempList[i].getName());
sArray = logDate.split("\.");
logDate = new String(sArray[0]);
if (isRead || (logDate.compareTo(date)) <= 0)
{
BufferedReader br = null;
String line = null;
br = new BufferedReader(new InputStreamReader(new FileInputStream(tempList[i].toString()), "UTF-8"));
while ((line = br.readLine()) != null)
{
String[] array = line.split(" ");
dealOneLine(array);
}
br.close();
}
}
allStatistic();
}
private void dealOneLine(String[] array)
{
if (array[0].equals("//"))
{
return;
}
if (map.get(array[0]) == null)
{
map.put(array[0], new Province(array[0]));
}
switch (array[1])
{
case "新增":
if (array[2].equals("疑似患者"))
{
map.get(array[0]).addSp(array[3]);
}
else
{
map.get(array[0]).addIp(array[3]);
}
break;
case "感染患者":
map.get(array[0]).removeIp(array[4]);
if (map.get(array[3]) == null)
map.put(array[3], new Province(array[3]));
map.get(array[3]).addIp(array[4]);
break;
case "疑似患者":
if (array[2].equals("流入"))
{
map.get(array[0]).removeSp(array[4]);
if (map.get(array[3]) == null)
map.put(array[3], new Province(array[3]));
map.get(array[3]).addSp(array[4]);
}
else
{
map.get(array[0]).addIp(array[3]);
map.get(array[0]).removeSp(array[3]);
}
break;
case "死亡":
map.get(array[0]).dead(array[2]);
break;
case "治愈":
map.get(array[0]).cure(array[2]);
break;
case "排除":
map.get(array[0]).removeSp(array[3]);
break;
default:
break;
}
}
- 将统计数据输出到指定文件
//生成输出文件
public void output() throws IOException
{
if (isFinish)
{
return;
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"));
if (isOutputAll)
{
country.output(isOutput,output,bw);
for (int i = 0; i < name.size(); i ++ )
{
if (map.get(name.get(i)) != null)
{
map.get(name.get(i)).output(isOutput, output, bw);
}
}
}
else
{
if (provinces.contains("全国"))
{
country.output(isOutput,output,bw);
}
for (int i = 0; i < provinceName.length; i ++ )
{
if (provinces.contains(provinceName[i]))
{
if (map.get(name.get(i)) == null)
{
map.put(provinceName[i], new Province(provinceName[i]));
}
map.get(provinceName[i]).output(isOutput, output, bw);
}
}
}
bw.write("// 该文档并非真实数据,仅供测试使用");
bw.close();
}
6.单元测试截图和描述
- 测试listout1.txt
- 测试listout2.txt
- 测试listout3.txt
- 测试默认日期、省份、类型
- 测试全国,浙江,福建
- 测试默认输出
- 测试指定类型的输出
7.单元测试覆盖率优化和性能测试,性能优化截图和描述
- 性能测试
8.代码规范链接
9.心路历程与收获
我在这次的作业中可以说是一波三折了,先是作业开始前浪了两天,要开始的时候电脑给我踹下床屏幕坏了,修了好几天,属实难受,到后面就只能赶工,但是后面发现越赶,出错越多,反而是让我的效率更低,而且因为赶工很多东西在网上搜索了,照本宣科,也来不及记忆就强行使用,直接导致的就是,原本我可能在这次作业中的收获是十分,现在可能只有3分,不仅过程难受,结局也难受。
还有就是,我发现自己对java这门语言的掌握程度非常低,编程过程中一度想改为c++,几乎要实现什么功能都只能上网搜,看GitHub,参考代码,非常的难受,这也让我明白了耀掌握一门语言,一定要经常的去使用它,同时也让我对自己的拖延症有了一个新的程度的认识,真的不应该拖延工作,因为不知道什么时候意外状况就来了,要反思。
10.技术路线图相关的5个仓库
- 仓库1:记录了一些技术摘要,部分文章来自网络,本项目的目的力求分享精品技术干货,以Java为主
java-bible- 仓库2:汇总java生态圈常用技术框架、开源中间件,系统架构、数据库、大公司架构案例、常用三方类库、项目管理、线上问题排查、个人成长、思考等知识
technology-talk- 仓库3:Java Core Sprout:处于萌芽阶段的 Java 核心知识库。
JCSprout- 仓库4:从Java基础、JavaWeb基础到常用的框架再到面试题都有完整的教程,几乎涵盖了Java后端必备的知识点
3y- 仓库5: 一份涵盖大部分Java程序员所需要掌握的核心知识。
JavaGuide