2013-10-04 87 views
0

我想在Javascript中构建一个文件比较脚本,它需要两个版本的文件并输出类似Github的东西来显示添加和删除。尽管如此,我仍然遇到了算法的逻辑问题。以下是我过程中的伪代码:文件比较脚本的逻辑

var j = 0; 
// check current file line by line 
for(i=0; i < currentFileArr.length; i++){ 

    // see if the current line is different 
    if(currentFileArr[i] !== previousFileArr[j]){ 

     if(previousFile.contains(currentFileArr[i])){ 
      // line is a deletion. find next line that wasn't deleted 
      while(currentFileArr[i] !== previousFileArr[j]){ 
       j++; 
      } 
     } else { 
      // line is an addition 
     } 
    } else { // lines are the same 
     j++; 
    } 
} 

主要问题是对于不是唯一的行。就像只有一个花括号的新线条或线条一样。

+3

或者如果我添加重复行?或删除重复的行?或重新缩进整个代码而不改变任何东西?对于一个简单的项目来说,这是一座桥梁我不久前尝试了一些非常接近你的东西......不要重新发明轮子;花时间定制https://code.google.com/p/google-diff-match-patch/以适应您的项目需求。如果你必须坚持你的代码,至少在比较前修剪()行以忽略空白和缩进变化... – dandavis

回答

1

您需要考虑文件中的每个唯一行作为metachar,即某些扩展字母表的“字符”。通过这种方式,你的两个文件都会变成“字符串”。

最有效的方法 - 创建散列表,包含唯一字符串,并在表中使用索引作为元字符。

此后,您可以通过Levenshtein算法搜索这些字符串之间的最小编辑序列 :

http://www.let.rug.nl/kleiweg/lev/levenshtein.html

http://en.wikipedia.org/wiki/Levenshtein_distance

http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance