java 代码查重(七)对比两个任意Java工程代码的相似度

Java工程代码相似度对比算法

目录

一、题目背景要求

二、相似度算法设计

三、算法效果测试

测试1: 测试两个完全相同的.java文件

测试2: 目标Java文件是源Java文件的子集

测试3: 源Java文件是目标Java文件的子集


一、题目背景要求

        两个Java代码工程,分别代码两名学生针对相同题目提交的Java作业。现在要对比这两个Java作业的相似度。

二、相似度算法设计

       

三、算法效果测试

测试1: 测试两个完全相同的.java文件

package com.homework.utils.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.homework.utils.similarity.JavaCheckTest.calSimilarity;

public class Test {
    private static final double similarityThred = 0.8;

    public static void main(String[] args)/*throws IOException*/ {
        //正常返回
        String path1="/Users/apple/Documents/springboot/my/springbootFTest/src/main/java/com/stock/wms/Service/Debt_finance_infoService.java";
        String path2="/Users/apple/Documents/springboot/my/springbootFTest/src/main/java/com/stock/wms/Service/Debt_finance_infoService.java";
//        String path1="/Users/apple/Documents/intelligentscoresystem";
//        String path2="/Users/apple/Documents/intelligentscoresystem/src/main/java/com/exercises";
        List<JavaFilePath> list1 = new ArrayList<JavaFilePath>();
        FindJavaFilesUtil.FindJavaFiles(new File(path1), list1);

        List<JavaFilePath> list2 = new ArrayList<JavaFilePath>();
        FindJavaFilesUtil.FindJavaFiles(new File(path2), list2);
        List<Double> similartyResult = new ArrayList<Double>();
        for(JavaFilePath javaTargetPath : list1) {
            double maxSimilarity = 0;
                 for(JavaFilePath javaOriPath : list2) {
                     try {
                            double similarity = calSimilarity(javaOriPath.getFilePath(),javaTargetPath.getFilePath());
                            if(similarity > similarityThred) {
                                if (similarity > maxSimilarity) {
                                    maxSimilarity = similarity;
                                }
                            }
                        } catch (Exception e) {
                         System.out.println("发生异常,当前对比文件目录:" + javaTargetPath.getFilePath() + ",  msg="+e.getMessage());
                         e.printStackTrace();
                     }
                 }
                if(maxSimilarity > 0) {
                    similartyResult.add(maxSimilarity);
                }
            System.out.println("当前对比文件目录:" + javaTargetPath.getFileName() +", 最大相似度:" + maxSimilarity);
            }

        //单个文件相似度超过80%的文件比例
        double similartyFileNums = (double)similartyResult.size()/list1.size();
        System.out.println("目标路径Java文件数量:" + list1.size());
        System.out.println("对比源路径Java文件数量:" + list2.size());
        System.out.println("相似度超过80%Java文件个数:"+similartyResult.size()+", 相似度超过80%的文件比例 : " + similartyFileNums);
    }

}

运行结果:

测试2: 目标Java文件是源Java文件的子集

public class Test {
    private static final double similarityThred = 0.8;

    public static void main(String[] args)/*throws IOException*/ {
        //正常返回
        String path1="/Users/apple/Documents/intelligentscoresystem/src/main/java/com/exercises";
        String path2="/Users/apple/Documents/intelligentscoresystem";
        List<JavaFilePath> list1 = new ArrayList<JavaFilePath>();
        FindJavaFilesUtil.FindJavaFiles(new File(path1), list1);

        List<JavaFilePath> list2 = new ArrayList<JavaFilePath>();
        FindJavaFilesUtil.FindJavaFiles(new File(path2), list2);
        List<Double> similartyResult = new ArrayList<Double>();
        for(JavaFilePath javaTargetPath : list1) {
            double maxSimilarity = 0;
                 for(JavaFilePath javaOriPath : list2) {
                     try {
                            double similarity = calSimilarity(javaOriPath.getFilePath(),javaTargetPath.getFilePath());
                            if(similarity > similarityThred) {
                                if (similarity > maxSimilarity) {
                                    maxSimilarity = similarity;
                                }
                            }
                        } catch (Exception e) {
                         System.out.println("发生异常,当前对比文件目录:" + javaTargetPath.getFilePath() + ",  msg="+e.getMessage());
                         e.printStackTrace();
                     }
                 }
                if(maxSimilarity > 0) {
                    similartyResult.add(maxSimilarity);
                }
            System.out.println("当前对比文件目录:" + javaTargetPath.getFileName() +", 最大相似度:" + maxSimilarity);
            }

        //单个文件相似度超过80%的文件比例
        double similartyFileNums = (double)similartyResult.size()/list1.size();
        System.out.println("目标路径Java文件数量:" + list1.size());
        System.out.println("对比源路径Java文件数量:" + list2.size());
        System.out.println("相似度超过80%Java文件个数:"+similartyResult.size()+", 相似度超过80%的文件比例 : " + similartyFileNums);
    }

}

运行结果:

目标路径Java文件数量:11
对比源路径Java文件数量:78
相似度超过80%Java文件个数:11, 相似度超过80%的文件比例 : 1.0

测试3: 源Java文件是目标Java文件的子集

测试使用目录:

String path1="/Users/apple/Documents/intelligentscoresystem";
String path2="/Users/apple/Documents/intelligentscoresystem/src/main/java/com/exercises";

运行结果:

当前对比文件目录:oritxt.java, 最大相似度:0.0
当前对比文件目录:targettxt.java, 最大相似度:0.0
当前对比文件目录:target.java, 最大相似度:0.0
当前对比文件目录:ori.java, 最大相似度:0.0
当前对比文件目录:Test.java, 最大相似度:0.0
当前对比文件目录:Utf8Filter.java, 最大相似度:0.0
当前对比文件目录:CORSFilter.java, 最大相似度:0.0
当前对比文件目录:CourseDao.java, 最大相似度:0.0
当前对比文件目录:StudentDao.java, 最大相似度:0.0
当前对比文件目录:CallResultDao.java, 最大相似度:0.0
当前对比文件目录:FinalStoreDao.java, 最大相似度:0.0
当前对比文件目录:RandomCallController.java, 最大相似度:0.0
当前对比文件目录:CourseController.java, 最大相似度:0.0
当前对比文件目录:MainApplication.java, 最大相似度:0.0
当前对比文件目录:FinalStoreController.java, 最大相似度:0.0
当前对比文件目录:IndexController.java, 最大相似度:0.0
当前对比文件目录:GradeJXLController.java, 最大相似度:0.0
当前对比文件目录:ParseStudentsController.java, 最大相似度:0.0
当前对比文件目录:UserController.java, 最大相似度:0.0
当前对比文件目录:ParseFile.java, 最大相似度:0.0
当前对比文件目录:XlsUtil.java, 最大相似度:0.0
当前对比文件目录:StrUtil.java, 最大相似度:0.0
当前对比文件目录:CallResult.java, 最大相似度:0.0
当前对比文件目录:StudentStatusEnum.java, 最大相似度:0.0
当前对比文件目录:ResponseList.java, 最大相似度:0.0
当前对比文件目录:Course.java, 最大相似度:0.0
当前对比文件目录:ResponseVO.java, 最大相似度:0.0
当前对比文件目录:Student.java, 最大相似度:0.0
当前对比文件目录:GradeV2ServiceImpl.java, 最大相似度:0.0
当前对比文件目录:FinalStoreServiceImpl.java, 最大相似度:0.0
当前对比文件目录:CourseServiceImpl.java, 最大相似度:0.0
当前对比文件目录:CallResultServiceImpl.java, 最大相似度:0.0
当前对比文件目录:StudentServiceImpl.java, 最大相似度:0.0
当前对比文件目录:GradeServiceImpl.java, 最大相似度:0.0
当前对比文件目录:StudentService.java, 最大相似度:0.0
当前对比文件目录:FinalStoreService.java, 最大相似度:0.0
当前对比文件目录:CourseService.java, 最大相似度:0.0
当前对比文件目录:GradeService.java, 最大相似度:0.0
当前对比文件目录:CallResultService.java, 最大相似度:0.0
当前对比文件目录:GradeV2Service.java, 最大相似度:0.0
当前对比文件目录:JavaFilePath.java, 最大相似度:0.0
当前对比文件目录:FileIO.java, 最大相似度:0.0
当前对比文件目录:FileReaderExample.java, 最大相似度:0.0
当前对比文件目录:Test.java, 最大相似度:0.0
当前对比文件目录:FindJavaFilesUtil.java, 最大相似度:0.0
当前对比文件目录:PaperCheckTest.java, 最大相似度:0.0
当前对比文件目录:EuclideanDistanceUtil.java, 最大相似度:0.0
当前对比文件目录:HammingUtil.java, 最大相似度:0.0
当前对比文件目录:SimHashV2Util.java, 最大相似度:0.0
当前对比文件目录:SimHashV3Util.java, 最大相似度:0.0
当前对比文件目录:SimHashUtil.java, 最大相似度:0.0
当前对比文件目录:ShortStringException.java, 最大相似度:0.0
当前对比文件目录:SimilarityUtilsSimHash.java, 最大相似度:0.0
当前对比文件目录:WordFrequencyUtil.java, 最大相似度:0.0
当前对比文件目录:TokenizeUtil.java, 最大相似度:0.0
当前对比文件目录:JavaKeywordFilter.java, 最大相似度:0.0
当前对比文件目录:SimilarityUtils.java, 最大相似度:0.0
当前对比文件目录:LevenshteinDistanceUtil.java, 最大相似度:0.0
当前对比文件目录:Test.java, 最大相似度:0.0
当前对比文件目录:JavaCheckTest.java, 最大相似度:0.0
当前对比文件目录:JavaparserUtil.java, 最大相似度:0.0
当前对比文件目录:Duplicate_checking.java, 最大相似度:0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
处理除以零的情况,返回0.0
当前对比文件目录:JPlagUtil2.java, 最大相似度:0.0
当前对比文件目录:ExtractKeywordsUtil.java, 最大相似度:0.0
当前对比文件目录:Test3.java, 最大相似度:1.0
当前对比文件目录:GradeJXLService.java, 最大相似度:1.0
当前对比文件目录:GradePOIService.java, 最大相似度:1.0000000000000002
当前对比文件目录:Test2.java, 最大相似度:1.0
当前对比文件目录:GradeVo.java, 最大相似度:1.0
当前对比文件目录:GradeJXLV2Service.java, 最大相似度:1.0
当前对比文件目录:GenGrade.java, 最大相似度:1.0
当前对比文件目录:ShowTableSwing.java, 最大相似度:1.0
当前对比文件目录:GradeVoForRead.java, 最大相似度:1.0
当前对比文件目录:Test1.java, 最大相似度:1.0
当前对比文件目录:Dir.java, 最大相似度:1.0
当前对比文件目录:XlsUtil.java, 最大相似度:0.0
当前对比文件目录:POIExcelUtil.java, 最大相似度:0.0
当前对比文件目录:StrUtil.java, 最大相似度:0.0
目标路径Java文件数量:78
对比源路径Java文件数量:11
相似度超过80%Java文件个数:11, 相似度超过80%的文件比例 : 0.14102564102564102

分析:

1)最大相似度=1.0,说明对应Java文件在源文件存在相同内容文件。 比如,当前对比文件目录:Dir.java, 最大相似度:1.0。 说明Dir.java与源目标Java文件集合中的某个文件的相似度为100%。

2)大相似度=0.0,说明对应Java文件在源文件不存在相同内容文件。 比如,当前对比文件目录:JavaCheckTest.java, 最大相似度:0.0。可以判定JavaCheckTest.java 与 源目标Java文件集合是没有相似的。

3)处理除以零的情况,返回0.0 ,说明对应文件内容在去掉注释、Java保留关键字后内容过短,不再计算相似度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多则惑少则明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值