Java實現文本差分 diff 工具代碼

工具類源碼

https://github.com/Uetty/common-tool/blob/dev/src/main/java/com/uetty/common/tool/algorithm/diff/LCSDiff.java

使用

LCSDiff lcsDiff = new LCSDiff(str1, str2, new EnglishWordMetadataPicker()); // 元數據的定義:一個英文單詞視爲一個不可分割單元(元數據),英文字母外的其餘字符,單個字符視爲一個不可分割單元(元數據)
//        LCSDiff lcsDiff = new LCSDiff(str1, str2);    // 使用默認元數據採揀器的版本:單個char視爲一個不可分割單元(元數據)
CommonInfo diff = lcsDiff.seekCommon();

CommonInfo:用於存儲公共文本在兩個字符串(str1和str2)中的位置
MetadataPicker:用於將字符串str1str2處理爲兩組元數據組成的數組
元數據:表示在diff的過程中作爲一個整體進行匹配的字符串,示例如下:

兩個字符串str1和str2如下(爲了方便演示,例子中選取的兩個字符串都沒有空格)
str1: 1+2=3one+two=three
str2: 11+2=13eleven+two=thirteen
定義他們由以下元數據組成(元數據間用空格分隔)
str1: 1 + 2 = 3 one + two = three
str2: 1 1 + 2 = 1 3 eleven + two = thirteen
那麼匹配到的共同字符串將會是如下3個字符串:
1+2= 3 +two=
由於str1中的one和str2中的eleven都是元數據,所以one中的e字符和elevent中的e字符不能產生匹配
同理,由於str2中的數字13是由兩個元數據1和3組成,所以13中的3能夠與str1中等號後面的3產生匹配

元數據採揀器的選取非常重要,會影響diff效果的好壞,元數據採揀器的好壞以業務需求作爲評定準則。此外,處理後元數據數組的長度將影響diff算法計算時佔用的內存大小。

例如:
對代碼進行diff這個業務邏輯,可以考慮用代碼中的特殊符號如{};空白字符等作爲分割字符來生成元數據,進行一次diff。還可以考慮用更細粒度的元數據採揀器,對初次匹配中不相同的內容再進行一次diff。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章