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

个人项目

时间:2024-09-14 13:25:43浏览次数:1  
标签:文件 30 String 个人 项目 args 60 参数

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-12
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-12/homework/13220
这个作业的目标 设计一个论文查重算法,给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件,在答案文件中输出其重复率。

1.项目地址:

https://github.com/Nethtra/3122004789

2.PSP表格

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

3.接口的设计与实现过程

代码设计模块分为四个类:

Check: 负责文章特征的提取与处理。实现提取文章中相邻的汉字双字词,计算出这些词的哈希值,并存储到一个排序集合中。
Compare: 提供比较两个文章特征集合的功能,计算两个文章共有的双字词数量。
Parse: 处理用户输入,并进行查重分析,调用Check和Compare类来进行文件处理和查重率的计算。
WrongMessage: 用于处理文件操作过程中可能发生的错误,主要是文件读取或写入异常。
关键函数:
Check的构造函数:负责文件的逐行读取和特征提取。
Compare.compare():使用双指针法高效地比较两个文章的特征集合。
Parse.main():处理输入参数,调用Check和Compare,最终输出查重率。

4. 性能分析


性能优化可以集中在以下几个方面:
文件处理效率:通过使用BufferedReader进行逐行读取,减少一次性读取大文件的内存消耗。
特征提取:通过TreeSet存储特征,自动排序避免了手动排序的时间消耗。
特征比较:使用双指针法高效地比较两个排序后的特征集合,时间复杂度为O(n)。

5.单元测试

testAllArticle():
测试整个目录下的所有文件,与原文档进行查重比较,输出查重率。该测试遍历了文件目录,模拟了实际使用中的批量处理情况。
测试数据思路:选择多个文本文件,将一个作为源文件(orig.txt),其余作为对比文件。模拟实际查重的场景,测试整个流程的正确性和稳定性。
testWrongArgs():
测试输入的文件路径不正确时的错误处理。
测试数据思路:故意输入错误的文件路径,验证程序在找不到文件时是否能够正确处理异常并输出错误信息。
testShortArgs():
测试输入参数数量不足时的处理。
测试数据思路:输入仅包含一个参数,检查程序是否能正确识别并提示参数不足。

package test;
/**
 * @version 1.0
 */

import java.io.File;
import java.util.Arrays;
import java.util.Stack;

import com.Parse;
import org.junit.Test;

public class test {
    /**
     * 测试某个目录下所有文件查重率
     */
    @Test
    public void testAllArticle() {
        String basePath = "src\\testfiles\\";
        String resPath = "src\\res.txt";
        String origin = "orig.txt";

        long startTime = System.currentTimeMillis();

        Stack<String> testFileName = getTestFileName(basePath);

        //测试每一个子文件查重率
        while (!testFileName.empty()) {
            String fileName = testFileName.pop();

            if (fileName.equals(origin)) {
                continue;
            }
            String[] args = {
                    basePath + origin,
                    basePath + fileName,
                    resPath
            };
            System.out.println("参数:"+ Arrays.toString(args));
            Parse.main(args);
            System.out.println();
        }

        long endTime = System.currentTimeMillis();
        System.out.println("消耗时间:" + new Double(endTime - startTime) / 1000 + "s");
    }
    /**
     * 测试命令行输入参数错误处理
     */
    @Test
    public void testWrongArgs(){
        String[] args={
                "wrong_origin_path",
                "wrong_target_path",
                "wrong_res_path",
        };
        System.out.println("参数:"+ Arrays.toString(args));
        Parse.main(args);
    }
    /**
     * 测试命令行输入参数错误处理
     */
    @Test
    public void testShortArgs(){
        String[] args={
                "wrong_args_length",
        };
        System.out.println("参数:"+ Arrays.toString(args));
        Parse.main(args);
    }

    /**
     * 仅当使用JProfiler时定义
     * 防止JVM过早退出,导致无法查看信息
     */
//    @Test
//    public void zwaitForJProfiler() {
//        try {
//            Thread.sleep(100 * 1000);
//        }catch (InterruptedException e){
//
//        }
//    }
    /**
     * 获取目录下的所有文件名
     * @param basePath 目录路径
     * @return 目录下的所有文件名
     */
    public static Stack<String> getTestFileName(String basePath){
        Stack<String> res=new Stack<String>();
        File dir = new File(basePath);
        if(dir.isDirectory()) {
            File[] files = dir.listFiles();
            for (File file : files) {
                if(file.isDirectory()){
                }else{
                    res.push(file.getName());
                }
            }
        }
        return res;
    }

}

6.异常处理

  1. ZeroFeature 异常
    设计目标:当无法从文件中提取任何双字词特征时触发该异常。可能的情况包括文件为空,文件只包含标点符号,或文件中的字符不足以组成双字词。
    异常处理逻辑:捕获ZeroFeature异常后,输出文件路径和相关错误信息。
    对应的错误场景:empty.txt为空文件,程序无法提取特征,会抛出ZeroFeature异常,并打印相应的错误提示。

  2. IOException(文件读取/写入异常)
    设计目标:当文件无法打开(路径错误、权限不足等)或写入失败时,捕获IOException异常,避免程序崩溃,并提示用户错误的文件路径。
    异常处理逻辑:在捕获IOException时,调用WrongMessage.openFileError()或WrongMessage.writeFileError(),打印详细的错误信息。
    对应的错误场景:输入了不存在的文件路径,程序无法找到指定文件,会抛出IOException,并打印出错误路径。

  3. 命令行参数不足异常(输入参数错误处理)
    设计目标:当用户未按程序要求提供足够的命令行参数时,程序应当提示参数不足。
    异常处理逻辑:在Parse.main()中,如果args.length不足3,则直接返回并提示输入参数不正确。
    对应的错误场景:输入的参数不足,程序会输出提示信息,提醒用户正确输入参数。

标签:文件,30,String,个人,项目,args,60,参数
From: https://www.cnblogs.com/kmiezaro/p/18406469

相关文章

  • github push项目
    新建项目进入项目文件夹,打开gitbash执行ls检查文件目录执行gitinit初始化执行gitadd.把文件都加到缓存区执行gitcommit-m"添加说明(注意代码规范)"gitbranch-Mmain重命名当前分支为miangitremoteaddoriginhttps://github.com/用户没/项目名.git向本地Git仓库......
  • 一个小例子,给你讲透 Go 配置管理,轻松将其融入到项目中
    在软件开发中,配置管理是一个不可或缺的部分。无论是开发环境、测试环境还是生产环境,我们都需要一种方法来存储和读取配置信息。在Golang项目中,Viper是一个非常流行且功能强大的库,用于处理配置文件。下面我会写一些例子,帮助大家快速上手。什么是Viper?不卖关子,直接上GitHub地址......
  • 项目实战 (11)---搜索进度
    目录背景相关技术需要解决的问题查询进度实时展示描述代码python后端htmlJS运行效果查询逻辑结合描述代码运行效果总结与问题背景通过前面1-10,视频搜索系统的前后端及视频录入功能已经可以正常使用。但是我们清楚随着视频量的增加及客户搜索并发数的增加,后......
  • 又一个爆火的AI项目,逼真到恐怖的Flux!【保姆级硬核教程】
    前言最近Flux爆火,人物写真更加逼真、细腻,这些图片你能看出来是AI生成的吗?甚至还能精准控制生成的文字,比如在手上和纸上写:Iamnotreal.无论是单人还是多人,脸部打光、肌肤纹理、毛发,都很难看出破绽。而这样的逼真图片,使用Flux就可以轻松生成:所有的AI设计工......
  • 程序员的 AI 启蒙:ChatGPT+ Copilot开发Vue3 仿简书项目 90%代码AI生成
    在人工智能技术日益成熟的今天,程序员们正在迎来一场全新的编程革命。ChatGPT和Copilot等AI工具的出现,让代码生成不再是遥不可及的梦想。本文将带你体验如何利用这些先进技术,仅用90%的代码量,开发出一个基于Vue3的仿简书项目,感受AI在编程领域的革新力量。一、引言ChatGPT和C......
  • 学习高校课程-系统设计与分析-项目管理和敏捷方法(lec2)
    Index(目录)ProjectManagementFundamentalsProjectinitiation(项目启动)Determiningprojectfeasibility(确定项目可行性)Activityplanningandcontrol(活动规划与控制)ProjectScheduling(项目进度安排)Ganttcharts(甘特图)PERTdiagrams(PERT图)Managingsys......
  • 南大通用GBase数据库在江西移动网管系统的国产化替换项目
    项目概况1、项目背景移动网管业务是为了更好地调配和管理网络资源及信息、对网络运行情况进行实时监测并根据业务情况以及网络流量使用情况进行网络资源的合理调配。随着江西移动业务的不断发展,网管系统处理负荷不断增加,系统使用的国外数据库产品版本老旧,系统运行过程中多次遇到数......
  • 项目中建立表相关的数据字典需要包含哪些信息?——数据字典设计
    文章目录1.表信息2.字段信息3.约束信息4.索引信息5.表关系6.示例数据示例数据字典条目表信息字段信息约束信息索引信息表关系设计数据字典时的注意事项创建一个表信息相关的数据字典是管理和维护数据库结构的重要步骤。一个完善的数据字典可以帮助你清晰地了......
  • 股票api接口程序化报备,程序化交易监管对个人量化交易者有何影响
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 基于Java中的SSM框架实现小说阅读网站书城管理平台项目【项目源码+论文说明】计算机毕
    基于java中的SSM框架实现小说阅读网站书城管理平台演示【内附项目源码+LW说明】摘 要简单而言信息化就是为了人们的生活便利所带来的新时代的东西,有了淘宝、京东,我们可以进行网购漂亮的衣服;有了快手、抖音我们可以真实的感受主播给我们带来最真实的货物;有了美团我们可以......