个人项目

作业概述

课程链接 班级连接
作业要求 作业链接
作业目标 实现一个查重算法

github连接

github

PSP表格

PSP 2.1 Personal Software Procesc Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 3020
Estimate 估计这个任务需要多少时间 300 300
Development 开发 200 240
Analysis 需求分析 3015
Design Sqec 生成设计文档 3040
Design Review 设计复审 3010
Coding Standard 代码规范(为目前的开发制定合适的规范) 1010
Design 具体设计 3040
Coding 具体编码 200240
Planning 计划 2020
Code Review 代码复审 3010
Test 测试(自我测试,修改代码,提交修改) 3040
Reporting 报告 3030
Test Repor 测试报告 2010
Size Measurement 计算工作量 1010
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 3030
合计 670735

计算模块接口的设计与实现过程

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开发

posted @ 2023-09-15 17:38  啦啦啦6  阅读(78)  评论(0)    收藏  举报