2008-09-25 12 views
41

我需要在Java字符串之間執行Diffs。我希望能夠從原始字符串和diff版本重建字符串。有沒有人在Java中這樣做過?你使用什麼庫?如何在Java中執行字符串Diffs?

String a1; // This can be a long text 
String a2; // ej. above text with spelling corrections 
String a3; // ej. above text with spelling corrections and an additional sentence 

Diff diff = new Diff(); 
String differences_a1_a2 = Diff.getDifferences(a,changed_a); 
String differences_a2_a3 = Diff.getDifferences(a,changed_a);  
String[] diffs = new String[]{a,differences_a1_a2,differences_a2_a3}; 
String new_a3 = Diff.build(diffs); 
a3.equals(new_a3); // this is true 
+0

另見http://stackoverflow.com/questions/479654/java-library-for-free-text-diff – Stewart 2013-06-17 16:40:37

回答

44

這個圖書館似乎有伎倆:google-diff-match-patch。它可以根據差異創建補丁串並允許重新應用補丁。

編輯:另一種解決方案可能是https://code.google.com/p/java-diff-utils/

+0

這些是不同的庫,FWIW – Kerinin 2013-06-10 22:00:23

+4

Maven google-diff-match-patch的存儲庫是[there](https://bitbucket.org/cowwoc/google-diff-match-patch/wiki/Home)。 – fracz 2016-01-14 21:14:37

+4

java-diff-utils的主動維護的分支似乎是https://github.com/bkromhout/java-diff-utils – koppor 2016-11-23 06:55:29

19

阿帕奇共同性有字符串DIFF

org.apache.commons.lang.StringUtils

StringUtils.difference("foobar", "foo"); 
+5

它返回第二個字符串的剩餘部分,在那裏它不同於第一起。這對我來說效率不高,因爲我會處理大文本。請參閱: StringUtils.difference(「ab」,「abxyz」) - >「xyz」 StringUtils.difference(「ab」,「xyzab」) - >「xyzab」; – 2008-09-25 10:33:12

+1

也要注意這個問題: `StringUtils.difference(「abc」,「」)=「」` `StringUtils.difference(「abc」,「abc」)=「」` – Alec 2016-07-04 17:57:53

1

使用來自算法建立了矩陣Levenshtein distance並提取編輯日誌。維基百科文章鏈接到了幾個實現,我確定其中有一個Java實現。

Levenshtein是Longest Common Subsequence算法的一個特例,您可能也想看看這個。

4

由於託斯滕說,你可以使用

org.apache.commons.lang.StringUtils;

System.err.println(StringUtils.getLevenshteinDistance("foobar", "bar")); 
1

如果您需要處理大容量數據之間的差異,並具有高效壓縮的差異,你可以嘗試的Java實現xdelta,進而實現了RFC 3284(VCDIFF)二進制差異文件,(應該工作也有字符串)。

-4
public class Stringdiff { 
public static void main(String args[]){ 
System.out.println(strcheck("sum","sumsum")); 
} 
public static String strcheck(String str1,String str2){ 
    if(Math.abs((str1.length()-str2.length()))==-1){ 
     return "Invalid"; 
    } 
    int num=diffcheck1(str1, str2); 
    if(num==-1){ 
     return "Empty"; 
    } 
    if(str1.length()>str2.length()){ 
     return str1.substring(num); 
    } 
    else{ 
     return str2.substring(num); 
    } 

} 

public static int diffcheck1(String str1,String str2) 
{ 
    int i; 
    String str; 
    String strn; 
    if(str1.length()>str2.length()){ 
     str=str1; 
     strn=str2; 
    } 
    else{ 
     str=str2; 
     strn=str1; 
    } 
    for(i=0;i<str.length() && i<strn.length();i++){ 
      if(str1.charAt(i)!=str2.charAt(i)){ 
       return i; 
      } 
    } 
     if(i<str1.length()||i<str2.length()){ 
      return i; 
     } 

    return -1; 

    } 
    }