首页 > 其他分享 >个人项目

个人项目

时间:2023-09-15 17:45:21浏览次数:21  
标签:String 个人 项目 System str println new out

作业概述

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

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

标签:String,个人,项目,System,str,println,new,out
From: https://www.cnblogs.com/chenaou/p/17705453.html

相关文章

  • vue前后端分离项目中,对于空字符串转可空类型出错的解决办法
    环境:netcore 6.0+序列化采用自带的System.Text.Json工具使用vue做前后端分离时,我们提交的对象中,可能有些字段是为空字符串,但是对应接口要求是int?,decimal?datetime?等类型。那么在序列化时,就会报错。因为空字符串无法直接反序列化为null 所以我们需要自定义一个转换规......
  • iOS开发实战-仿小红书App开发-2-项目总体设计,TabBarController,启动页,深色模式
    1.新建一个LittlePink项目 完成一些配置. 2.在Main中新增一个TabBarController.把箭头给TbaBarController. 除了原有的一个ViewController外,再拉两个ViewController,使Main中共有5个ViewController. 将主界面Ctrl加拖拽到其他三个ViewController中,选择ViewCon......
  • 【ODPS新品发布第1期】DataWorks全新发布:增强分析/数据建模个人版等新能力
    阿里云ODPS系列产品以MaxCompute、DataWorks、Hologres为核心,致力于解决用户多元化数据的计算需求问题,实现存储、调度、元数据管理上的一体化架构融合,支撑交通、金融、科研、等多场景数据的高效处理,是目前国内最早自研、应用最为广泛的一体化大数据平台。DataWorks新重点能力介绍新......
  • 软件工程个人项目
    软件工程个人项目软件工程班级链接作业要求作业链接github链接github作业目标设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率PSP表格PSP2.1PersonalSoftwareProcessStages预估耗......
  • HarmonyOS/OpenHarmony应用开发-DevEco Studio新建项目的整体说明
    一、文件-新建-新建项目二、传统应用形态与IDE自带的模板可供选用与免安装的元服与IDE中自带模板的选择三、以元服务,远程模拟器为例说明IDE整体结构1区是工程目录结构,是最基本的配置与开发路径等的认知。2区是代码开发与修改区,是开发者主要的工作区域。3.是效果展示区,包括远程模拟......
  • go包依赖管理-构建完整的依赖项目:目录结构及包的调用
    目录结构:<home>/|--greetings/|--hello/1.分别进入对应目录创建以上目录结构//bash切换到用户主目录 cd$HOMEPAHT$ //bash新建greetings目录并进入该目录mkdirgreetingscdgreetings//bash创建模组example.com/greetings$gomodinitexample.com/greetingsgo:......
  • Salesforce正在推出AI功能,传统的项目文档管理还需要么?
    随着新版本的发布,Salesforce平台愈发强大,但也更加复杂。无论你是如何使用Salesforce的,使用文档都有助于保持组织性。特别是当下Salesforce正在推出AI功能,为组织带来巨大的竞争优势。AI需要准确的数据,组织文档越好,AI可以提供的结果就越准确。ElementsGPT已经使用AI来交付惊人的......
  • docker部署项目
    1.自定义网络相关1.1.自定义网络操作创建自定义网络,并设置相关网络配置:dockernetworkcreate--driverbridge--subnet192.168.0.1/16--gateway192.168.0.1mynet参数说明:删除自定义网络mynet:(注意:没有容器使用此网络才能删除)dockernetworkrmmynet查看docker中已安装的所......
  • 洗面奶检测的项目包含哪些?
    洗面奶,属于面部洁肤制品。清洗皮肤时,洗面奶清洗的对象物是人体面部的皮肤分泌的皮脂、汗、剥离脱落的角质层细胞等从身体上产生的污垢,以及灰尘、各种微生物、美容化妆品残留物等来自外部的污垢。这些残留代谢产物是不稳定的,可与空气中的氧,或沉积分子反应。在暴露于阳光时或皮肤上有......
  • Electron-vue项目打包遇坑
    项目背景一个Electron+vue2的桌面应用项目,进行打包使用了vue-cli-plugin-electron-builder将Electron和vue结合直接使用electron-builder打包问题一:打包后,background.js中会出现模块引入报错。Electron是commonJs规范,但使用了ESM规范import{createProtocol}from'vu......