作业概述
课程链接 | 班级连接 |
---|---|
作业要求 | 作业链接 |
作业目标 | 实现一个查重算法 |
github连接
PSP表格
PSP 2.1 | Personal Software Procesc Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 20 |
Estimate | 估计这个任务需要多少时间 | 300 | 300 |
Development | 开发 | 200 | 240 |
Analysis | 需求分析 | 30 | 15 |
Design Sqec | 生成设计文档 | 30 | 40 |
Design Review | 设计复审 | 30 | 10 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 200 | 240 |
Planning | 计划 | 20 | 20 |
Code Review | 代码复审 | 30 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 40 |
Reporting | 报告 | 30 | 30 |
Test Repor | 测试报告 | 20 | 10 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | 30 |
合计 | 670 | 735 |
计算模块接口的设计与实现过程
1.代码组织,使用maven进行项目的管理测试和打包
2.类与函数的设计,共有四个类,其中三个是计算类,1个是测试类
3.Main类主要是作为程序的入口,Count类用于记录数据,输出结果,StringSim类用于字符串处理和计算
4.算法的关键,逐步读取两个文件,对读取到的字符串进行统计,获取连续相同字符的数量,最后计算相似度
5.算法的优点:无需将全文一次读如内存,两个文件都仅需遍历一次,无需调用第三方库,可以处理短文本和长文本
性能改进
在统计字符时,双重循环,如果遇到相似的字符,就更换下一次循环起点
性能分析图
//函数展示
public static void charCount(String re,String other,Count count){
int index=0;
for (int i = 0; i < other.length(); i++) {
for (int j = index; j < re.length(); j++) {
if (other.charAt(i)==re.charAt(j)){
count.repet= count.repet+Count.w;
Count.w=0.95;
index=j+1;
break;
}else {
Count.w=0.05;
}
}
}
}
单元测试
//部分测试代码
static String fileAddr="/home/se/testDir/text/orig.txt";//源文件
static String[] copyFiles={
"/home/se/testDir/text/orig_0.8_add.txt",
"/home/se/testDir/text/orig_0.8_del.txt",
"/home/se/testDir/text/orig_0.8_dis_1.txt",
"/home/se/testDir/text/orig_0.8_dis_10.txt",
"/home/se/testDir/text/orig_0.8_dis_15.txt",
};//疑似抄袭文件
static String outPutFile="/home/se/testDir/text/out.txt";//输出文件
//前5组为普通测试
@Test
public void mainTestDemo1(){
String str=copyFiles[0];
System.out.println("疑似文件:"+str);
System.out.println("源文件:"+fileAddr);
System.out.println("测试结果:");
Main.main(new String[]{fileAddr,str,outPutFile});
System.out.println("\n\n");
}
@Test
public void mainTestDemo2(){
String str=copyFiles[1];
System.out.println("疑似文件:"+str);
System.out.println("源文件:"+fileAddr);
System.out.println("测试结果:");
Main.main(new String[]{fileAddr,str,outPutFile});
System.out.println("\n\n");
}
@Test
public void mainTestDemo3(){
String str=copyFiles[2];
System.out.println("疑似文件:"+str);
System.out.println("源文件:"+fileAddr);
System.out.println("测试结果:");
Main.main(new String[]{fileAddr,str,outPutFile});
System.out.println("\n\n");
}
@Test
public void mainTestDemo4(){
String str=copyFiles[3];
System.out.println("疑似文件:"+str);
System.out.println("源文件:"+fileAddr);
System.out.println("测试结果:");
Main.main(new String[]{fileAddr,str,outPutFile});
System.out.println("\n\n");
}
@Test
public void mainTestDemo5(){
String str=copyFiles[4];
System.out.println("疑似文件:"+str);
System.out.println("源文件:"+fileAddr);
System.out.println("测试结果:");
Main.main(new String[]{fileAddr,str,outPutFile});
System.out.println("\n\n");
}
测试数据思路:使用junit的Test功能编写单元测试函数,调用main函数来测试
测试覆盖率
异常处理
1.文件无法找到
//处理代码
//读如文件
FileReader file1,file2;
//输出文件
File file3;
try {
file1=new FileReader(args[0]);
file2=new FileReader(args[1]);
file3=new File(args[2]);
} catch (FileNotFoundException e) {
System.out.println("有文件不存在");
return;
}
if (Count.isBigFile(new File(args[0]))||Count.isBigFile(new File(args[1]))){
System.out.println("文件可能过大");
return;
}
//测试代码
//7.文件无法找到
@Test
public void fileNotFoundTest(){
System.out.println("文件找不到时:");
Main.main(new String[]{fileAddr,"12345",outPutFile});
System.out.println("\n\n");
}
"666"为不存在的路径
2.参数错误
//处理代码
if (args.length==1){
if (args[0].equals("help")){
System.out.println("java -jar Check.jar [源文件] [疑似抄袭文件] [输出文件]");
System.out.println("文件均采用绝对路径");
return;
}
}
if (args.length != 3) {
System.out.println("参数错误!");
return;
}
//测试代码
//8.参数传递有误
@Test
public void commondTest(){
System.out.println("参数错误时:");
Main.main(new String[]{"666"});
System.out.println("\n\n");
}
3.短文本
//测试代码
static String shortFile="/home/se/testDir/text/short_file.txt";
static String shortCopyFile="/home/se/testDir/text/short_file2.txt";
//9.短文本
@Test
public void shortTest(){
System.out.println("文本长度很短时:");
Main.main(new String[]{shortFile,shortCopyFile,outPutFile});
System.out.println("短文本依旧可以查重");
System.out.println("\n\n");
}
程序有能力处理短文本,和空文本,因此可以运行,不会出现异常
4.大文本处理
//异常处理代码
public static boolean isBigFile(File file){
long len;
len=file.length();
return len / (1048576) > 3;
}
个人认为,文本文件大于3MB就已经算是大文本了
//测试代码
static String bigFile="/home/se/Picture/pog.png";
//10.大文件处理
@Test
public void bigFileTest(){
System.out.println("大文件处理");
Main.main(new String[]{fileAddr,bigFile,outPutFile});
System.out.println("\n\n");
}
用于测试的文件是一个11M的大文件,触发了大文本的条件
注:程序在内核版本6.5.2-1-default的linux系统下使用openJDK11开发
标签:String,个人,项目,System,str,println,new,out From: https://www.cnblogs.com/chenaou/p/17705453.html