Pergunta

Como posso implementar uma função diff, como a história questão revisão do Stack Overflow?

Foi útil?

Solução

Você tem aqui um javascript exemplo da implementação de um algoritmo diff.

Com base em:

P. Heckel, uma técnica para isolar as diferenças entre os arquivos Comm. ACM, 21, (4), 264--268 (1978).

A implementação, em si, tem duas funções, uma das quais é recomendado para uso:

diffString( String oldFile, String newFile )

Este método tem duas cordas e calcula as diferenças de cada um. O resultado final é o 'newFile' marcado com HTML (para significar ambas as deleções do velhoArquivo e adições ao newFile).

Outras dicas

eu iria encontrar o código para utilidade e utilização do FreeBSD diff que, como a linha de base. Não há nenhum ponto em rodas inventar re-quando a licença permite a este tipo de cópia.

A maioria dos algoritmos são baseados em LCS: livre Longest subsequência comum. Não é óbvio para implementá-lo de forma eficiente. Você provavelmente vai encontrar várias implementações na Net, para vários idiomas.

Eu acho que a única maneira seria comparar cada personagem formando as 2 strings. Algo parecido com isto:


void diff(String first,String second) {
   int biggest = (first.length() > second.length()) ? first.length() : second.length();
   for(int i = 0;i < biggest;i++) {
      //compare each char from the longest string with each char from the shorter
      // do something with them if they're not equal
   }
}

Este é apenas um esboço de como eu faria isso. Tudo depende do que você quer fazer com os dados.

Se o que você quer é o histórico de revisões, não reinventar a roda a partir de diff. Apenas jogue tudo em controle de versão e utilizar as suas instalações diff e madeireiras. Para simples, história algo linear tão simples como RCS vai fazer. Ou você pode jogar o mais recente canhão para ele e usar git .

A maioria dos utilitários diff fazer uma comparação linha por linha. estouro de pilha faz um diff palavra por palavra. Para que algo como wdiff é necessário. A maioria dos sistemas de controle de versão permite que você conecte o diff. Fora da caixa, git diff --color-words vem notavelmente perto o que é feito aqui. Com um pouco de mexer com as configurações que você provavelmente pode fazê-lo cuspir algo que você pode então fazer em uma página web bonito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top