Вопрос

Как я могу реализовать diff функция, такая как история изменений вопроса Stack Overflow?

Это было полезно?

Решение

У вас здесь есть пример javascript о реализации дифференциального алгоритма.

Основанный на:

P.Геккель, метод выделения различий между файлами Связь.ACM, 21, (4), 264--268 (1978).

Сама реализация имеет две функции, одна из которых рекомендуется к использованию:

diffString( String oldFile, String newFile )

Этот метод принимает две строки и вычисляет различия в каждой из них.Конечным результатом является 'newFile', помеченный HTML (для обозначения как удалений из старого файла, так и дополнений к новому файлу).

Другие советы

Я бы нашел код для утилиты FreeBSD diff и использовал его в качестве базового.Нет смысла заново изобретать колеса, когда лицензия допускает такого рода копирование.

Большинство алгоритмов основаны на LCS: Самая длинная общая подпоследовательность.Не очевидно, можно ли реализовать это эффективным способом.Вероятно, вы найдете различные реализации в Сети для разных языков.

Я думаю, единственным способом было бы сравнить каждый символ , образующий 2 строки .Что - то вроде этого :


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
   }
}

Это всего лишь набросок того , как я бы это сделал .Все зависит от того , что вы хотите сделать с данными .

Если вам нужна история изменений, не изобретайте велосипед заново, начиная с diff.Просто перенесите все в систему управления версиями и используйте ее возможности diff и ведения журнала.Для простой линейной истории что-то столь же простое, как RCS сделаю.Или вы можете направить на него новейшую пушку и использовать мерзавец.

Большинство утилит diff выполняют построчное различие.Переполнение стека выполняет дословное различие.Для этого нужно что-то вроде вдифф это необходимо.Большинство систем контроля версий позволяют подключить утилиту diff.Из коробки, git diff --color-words это удивительно близко к тому, что делается здесь.Немного повозившись с настройками, вы, вероятно, сможете заставить его выдать то, что вы затем сможете превратить в красивую веб-страницу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top