使用求2个字符串最长公共子序列的方法来实现 git diff 算法 java 实现

测试类 GitDiffTest2.java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;public class GitDiffTest2 {private static String folder = "\\xxx\\";private static List<String> lines_v1 = loadTxtFile2List(folder + "DemoClass1.java" );private static List<String> lines_v2 = loadTxtFile2List(folder + "DemoClass2.java");public static void main(String[] args) {/* lines_v1 = new ArrayList<>();lines_v2 = new ArrayList<>();lines_v1.add( "m" );lines_v1.add( "o" );lines_v1.add( "t" );lines_v1.add( "h" );lines_v1.add( "e" );lines_v1.add( "r" );lines_v2.add( "m" );lines_v2.add( "o" );lines_v2.add( "n" );lines_v2.add( "s" );lines_v2.add( "t" );lines_v2.add( "e" );lines_v2.add( "r" );*/int size_v1 = lines_v1.size();int size_v2 = lines_v2.size();int[][] dp = new int[size_v1][size_v2];for (int index_v1 = 0; index_v1 < size_v1; index_v1++) {for (int index_v2 = 0; index_v2 < size_v2; index_v2++) {String line_v1 = lines_v1.get(index_v1);String line_v2 = lines_v2.get(index_v2);if ( line_v1.equals( line_v2 ) ) {if( index_v1 == 0 || index_v2 == 0 ){// v1:...a// v2:   adp[index_v1][index_v2] = 1;}else {// v1:...a// v2:...adp[index_v1][index_v2] = dp[index_v1 - 1][index_v2 - 1] + 1;}} else {if( index_v1==0 || index_v2==0 ){// v1:...a// v2:   bdp[index_v1][index_v2] = 0;}else {// v1:...a// v2:...b// v1: ...   a// v2:...b        此时,v1 的 a 前面的部分 "..." 和 v2 的 "...b" 来求最长公共子串长度int lcs1 = dp[index_v1 - 1][index_v2];// v1:...a// v2: ...   b    此时,v2 的 b 前面的部分 "..." 和 v1 的 "...a" 来求最长公共子串长度int lcs2 = dp[index_v1][index_v2 - 1];dp[index_v1][index_v2] = Math.max( lcs1,lcs2 );}}}}List<String> result = new ArrayList<>();int index_v1 = lines_v1.size() - 1;int index_v2 = lines_v2.size() - 1;while (index_v1 >= 0 && index_v2 >= 0) {String line_v1 = lines_v1.get(index_v1);String line_v2 = lines_v2.get(index_v2);if ( line_v1.equals( line_v2 ) ) {// v1:..... a// v2:  ... a// 原封不动的输出行 a,因为 新旧版本文本中都有 a 行result.add( "  " + line_v1 );index_v1--;index_v2--;}else {// v1:..... a// v2:  ... b// v1:  ..... a// v2:  ... b      如果 lcs1 更长,则最长公共子串中不包含 行a,意味着 v2版本中需要删除v1版本中的行aint lcs1 = dp[index_v1 - 1][index_v2];// v1:..... a// v2:    ... b    如果 lcs2更长,则最长公共子串中不包含行b,意味着v2版本中需要新增 行bint lcs2 = dp[index_v1][index_v2-1];if ( lcs1 > lcs2 ) {result.add( "- " + line_v1 );index_v1--;} else {result.add( "+ " + line_v2 );index_v2--;}}}while (index_v2 >= 0) {result.add("+ " + lines_v2.get(index_v2));index_v2--;}while (index_v1 >= 0) {result.add("- " + lines_v1.get(index_v1));index_v1--;}for (int k = result.size() - 1; k >= 0; k--) {System.out.println(result.get(k));}}private static List<String> loadTxtFile2List(String filePath) {BufferedReader reader = null;List<String> lines = new ArrayList<>();try {reader = new BufferedReader(new FileReader(filePath));String line = reader.readLine();while (line != null) {lines.add( line );line = reader.readLine();}return lines;} catch (Exception e) {e.printStackTrace();return null;} finally {if (reader != null) {try {reader.close();} catch (Exception e) {e.printStackTrace();}}}}
}

旧版本文本样例文件 DemoClass1.java:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.similarity.LevenshteinDistance;@Slf4j
public class DemoClass1 {private static final LevenshteinDistance LEVENSHTEIN_DISTANCE = LevenshteinDistance.getDefaultInstance();public static String null2emptyWithTrim( String str ){if( str == null ){str = "";}str = str.trim();return str;}public static String requiredStringParamCheck(String param, String paramRemark) {param = null2emptyWithTrim( param );if( param.length() == 0 ){String msg = "操作失败,请求参数 \"" + paramRemark + "\" 为空";log.error( msg );throw new BusinessLogicException( msg );}return param;}public static double calculateSimilarity( String str1,String str2 ){int distance = LEVENSHTEIN_DISTANCE.apply(str1, str2);double similarity = 1 - (double) distance / Math.max(str1.length(), str2.length());System.out.println("相似度:" + similarity);return similarity;}
}
新版本文本样例文件 DemoClass2.java:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.similarity.LevenshteinDistance;@Slf4j
public class DemoClass2 {private static final LevenshteinDistance LEVENSHTEIN_DISTANCE = LevenshteinDistance.getDefaultInstance();private static final LevenshteinDistance LEVENSHTEIN_DISTANCE1 = LevenshteinDistance.getDefaultInstance();private static final LevenshteinDistance LEVENSHTEIN_DISTANCE2 = LevenshteinDistance.getDefaultInstance();public static String null2emptyWithTrim( String str ){// if( str == null ){//     str = "";// }// str = str.trim();return str;}public static String requiredStringParamCheck(String param, String paramRemark) {return null;}public static double calculateSimilarity( String str1,String str2 ){try {int distance = LEVENSHTEIN_DISTANCE.apply(str1, str2);double similarity = 1 - (double) distance / Math.max(str1.length(), str2.length());return similarity;}catch ( Exception e ){e.printStackTrace();return 0d;}}
}

测试输出:

  import lombok.extern.slf4j.Slf4j;import org.apache.commons.text.similarity.LevenshteinDistance;@Slf4j
- public class DemoClass1 {
+ public class DemoClass2 {private static final LevenshteinDistance LEVENSHTEIN_DISTANCE = LevenshteinDistance.getDefaultInstance();
+     private static final LevenshteinDistance LEVENSHTEIN_DISTANCE1 = LevenshteinDistance.getDefaultInstance();
+     private static final LevenshteinDistance LEVENSHTEIN_DISTANCE2 = LevenshteinDistance.getDefaultInstance();public static String null2emptyWithTrim( String str ){
-         if( str == null ){
-             str = "";
-         }
-         str = str.trim();
+         // if( str == null ){
+         //     str = "";
+         // }
+         // str = str.trim();return str;}public static String requiredStringParamCheck(String param, String paramRemark) {
-         param = null2emptyWithTrim( param );
-         if( param.length() == 0 ){
-             String msg = "操作失败,请求参数 \"" + paramRemark + "\" 为空";
-             log.error( msg );
-             throw new BusinessLogicException( msg );
-         }
-         return param;
+         return null;}public static double calculateSimilarity( String str1,String str2 ){
-         int distance = LEVENSHTEIN_DISTANCE.apply(str1, str2);
-         double similarity = 1 - (double) distance / Math.max(str1.length(), str2.length());
-         System.out.println("相似度:" + similarity);
-         return similarity;
+         try {
+             int distance = LEVENSHTEIN_DISTANCE.apply(str1, str2);
+             double similarity = 1 - (double) distance / Math.max(str1.length(), str2.length());
+             return similarity;
+         }catch ( Exception e ){
+             e.printStackTrace();
+             return 0d;
+         }}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19.C++ 中将一维数组转成多维的三种方式

文章目录 使用reinterpret_cast强制类型转换使用static_cast 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 使用reinterpret_cast reinterpret_cast作用为&#xff1a;允许将任何指针转换为任何其他指针类型。 #include <iostream&…

CC2530basic_Rf串口无线收发

1初始化板 2定义无线并初始化 3接收数据发送数据 #include "hal_defs.h" #include "hal_cc8051.h" #include "hal_int.h" #include "hal_mcu.h" #include "hal_board.h" #include "hal_led.h" #include "…

Vue3为什么会推出组合式API

前言 大学前端入门学的vue2&#xff0c;工作了又用的React&#xff0c;现在想学习一下Vue3&#xff0c;开篇就介绍了组合式API&#xff0c;这和我认知里的vue2的选项式API区别还是蛮大的。本篇文章简单介绍一下组合式API。 什么是组合式API Vue 3引入了一种新的 API&#xf…

计算函数的变分是什么意思

计算函数的变分是指在变分法中寻找函数的极值。变分法是一种数学方法&#xff0c;用于求解函数或泛函的极值问题。在物理学、工程学和数学的最优化问题中&#xff0c;变分法是寻找函数使得某个泛函&#xff08;函数的函数&#xff09;达到极值的过程。 在数学上&#xff0c;泛…

vue+less+style-resources-loader 配置全局颜色变量

全局统一样式后&#xff0c;可配置vue.config.js实现全局颜色变量&#xff0c;方便在编写时使用统一风格的色彩 一、新建global.less 二、下载安装style-resources-loader npm i style-resources-loader --save-dev三、在vue.config.js中进行配置 module.exports {pluginOpt…

Python Locals:引领代码风潮,变量管理新尝试

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;locals()函数是一个强大的工具&#xff0c;它使程序员能够访问和操作当前作用域内的局部变量。本文将深入探讨locals()函数的功能、应用和重要性。 动态变量赋值和操作 locals()函数让我…

程序员の养生之道

作为一个程序员&#xff0c;养生确实很重要&#xff0c;因为长时间的工作可能导致身体和心理的不适。以下是一些建议&#xff0c;可以帮助程序员保持健康和延寿&#xff1a; 合理的作息时间&#xff1a; 尽量保持规律的作息时间&#xff0c;保证充足的睡眠。规律的作息可以帮助…

算法通关村第七关—理解二叉树的遍历(白银)

深入理解前中后序遍历 给定一棵二叉树 二叉树前序遍历 public void preorder(TreeNode root,List<Integer>res){if&#xff08;rootnull){return;}res.add(root.val);preorder(root.left,res);preorder(root.right,res); }递归的过程如下图所示 从图中可以看到&#x…

JavaScript编程基础 – For循环

JavaScript编程基础 – For循环 JavaScript Programming Essentials – For Loop By JacksonML 循环可以多次执行代码块&#xff0c;而不用反复重写相同的语句。这无疑对提升代码质量、减少错误大有脾益。本文将简要介绍for循环的几种案例&#xff0c;希望对读者有所帮助。 …

Ubuntu 安装adb

安装adb驱动到ubuntu系统下&#xff1a; 1、更新一遍软件源&#xff1a; sudo apt-get update 2、安装adb工具&#xff1a; sudo apt-get install android-tools-adb 3、检查安装是否成功&#xff1a; adb version 4、列出当前的adb设备 sudo adb devices

【Python篇】文件概述 | 读文件 | 写文件 | 追加文件操作

文章目录 &#x1f339;什么是文件&#x1f6f8;读 操作 — r⭐打开文件⭐读取文件&#x1f388;循环读取&#x1f388;读取文件中某一个词语的个数 ⭐关闭文件 &#x1f33a;小结&#x1f6f8;写 操作 — w&#x1f6f8;追加 操作 — a &#x1f339;什么是文件 文件是计算机…

『亚马逊云科技产品测评』活动征文|基于亚马逊云EC2搭建OA系统

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 亚马逊EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马…

2023年AI报告:首个投研GPTs测评重塑AI竞争格局

今天分享的是AI系列深度研究报告&#xff1a;《2023年AI报告&#xff1a;首个投研GPTs测评重塑AI竞争格局》。 &#xff08;报告出品方&#xff1a;国盛证券&#xff09; 报告共计&#xff1a;10页 1.一键创建 GPTs 助力行业研究 GPTs 目前仅对企业用户和 ChatGPT Plus 会员…

右值引用和移动语句(C++11)

左值引用和右值引用 回顾引用 我们之前就了解到了左值引用&#xff0c;首先我们要了解引用在编译器底层其实就是指针。具体来说&#xff0c;当声明引用时&#xff0c;编译器会在底层生成一个指针来表示引用&#xff0c;但在代码编写和使用时&#xff0c;我们可以像使用变量类…

HarmonyOS系统和Android系统有什么区别?

鸿蒙系统和安卓系统有如下几点区别&#xff1a;点击这里查看获取鸿蒙系统资料方式 (qq.com) 一、开发商不同&#xff1a; 鸿蒙OS&#xff1a;由中国华为公司主导开发的系统&#xff0c;2019年首次发布&#xff0c;现在已经更新至鸿蒙OS4.0。 安卓系统&#xff1a;是由安迪鲁宾…

visual Studio MFC 平台实现图像增强中的线性变换(负变换)和非线性变换(对数与幂律)

MFC 实现数字图像处理中的图像增强操作 本文使用visual Studio MFC 平台实现图像增强中典型的三种图像增强的方法中的两大类&#xff0c;包括线性变换–>负变换&#xff0c;非线性变换–>对数变换和幂律变换&#xff1b;其中第三大类分段式变换可以参考MFC实现图像增强–…

Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程

Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程 一、Termux配置1、下载安装2、配置存储和换源3、基本工具安装 二、Kali Linux安装1、下载安装脚本2、更换apt源3、图形化安装 三、Kali Nethunter安装1、下载安装脚本2、更换apt源3、图形化连接 四、报错汇总1、…

2023年5月电子学会青少年软件编程 Python编程等级考试一级真题解析(判断题)

2023年5月Python编程等级考试一级真题解析 判断题(共10题,每题2分,共20分) 26、在编写较长的Python程序时,所有代码都不需要缩进,Python会自动识别代码之间的关系 答案:错 考点分析:考查python代码书写格式规范,python编写较长的程序时,需要明确严格的缩进,不然有…

【ArcGIS Pro微课1000例】0044:深度学习--面部模糊(马赛克)

本文讲解ArcGIS Pro中通过深度学习工具实现人脸面部模糊,起到马赛克的作用。 文章目录 一、效果对比二、工具介绍三、案例实现一、效果对比 原始图片: 深度学习后的模糊照片: 二、工具介绍 本工具为ArcGIS Pro工具箱中的深度学习工具中的:使用深度学习分类像素,如下所示…

vue3中自定义hook函数

使用Vue3的组合API封装的可复用的功能函数 自定义hook的作用类似于vue2中的mixin技术 自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂 案例: 收集用户鼠标点击的页面坐标 hooks/useMousePosition.ts文件代码&#xff1a; import { ref, onMounted, onUnmounted …