Java: проверка, если два текстовых абзаца отличаются, давая ошибку при удалении предложения
Я работаю над приложением Java, которое предназначено для ведения заметок. Теперь, когда пользователь редактирует текст в заметке, я хочу найти разницу между oldText и newText, чтобы я мог добавить его в историю этой заметки.
Для этого я делю каждый абзац на несколько строк, разбивая их на точки. Затем я сравниваю предложения в этом списке строк, используя diff-match-patch.
На данный момент он отлично работает для добавления, редактирования в тексте, но как только я удаляю предложение, возникает проблема.
Ситуация
old text : sentence1, sentence2, sentence3, sentence4
new Text : sentence1, sentence3, sentence4.
Но из-за этого компаратор видит, что предложение 2 заменяется предложением 3, предложение 3 - предложением 4 и так далее, и так далее.
Это не желаемое поведение, но я не знаю, как исправить ситуацию. Я опубликую свой код, пожалуйста, дайте мне знать, как я могу просто получить различия между ними должным образом.
GroupNoteHistory - это объект, в котором я сохраняю oldText, и только newText изменяется. Я надеюсь, что мой код понятен.
// Below is List of oldText and newText splitted at dot.
List<String> oldTextList = Arrays.asList(mnotes1.getMnotetext().split("(\\.|\\n)"));
List<String> newTextList = Arrays.asList(mnotes.getMnotetext().split("(\\.|\\n)"));
// Calculating the size of loop.
int counter = Math.max(oldTextList.size(), newTextList.size());
String oldString;
String newString;
for (int current = 0; current < counter; current++) {
oldString = "";
newString = "";
if (oldTextList.size() <= current) {
oldString = "";
newString = newTextList.get(current);
} else if (newTextList.size() <= current) {
oldString = oldTextList.get(current);
newString = "";
} else {
// isLineDifferent comes from diff_match_patch
if (isLineDifferent(oldTextList.get(current), newTextList.get(current))) {
noEdit = true;
groupNoteHistory.setWhatHasChanged("textchange");
oldString += oldTextList.get(current);
newString += newTextList.get(current);
}
}
if (oldString != null && newString != null) {
if (!(groupNoteHistory.getNewNoteText() == null)) {
if (!(newString.isEmpty())) {
groupNoteHistory.setNewNoteText(groupNoteHistory.getNewNoteText() + " " + newString);
}
} else {
groupNoteHistory.setNewNoteText(newString);
}
if (!(groupNoteHistory.getOldText() == null)) {
if (!(oldString.isEmpty())) {
groupNoteHistory.setOldText(groupNoteHistory.getOldText() + " " + oldString);
}
} else {
groupNoteHistory.setOldText(oldString);
}
}
Пожалуйста, дайте мне знать, что я могу сделать. Большое спасибо.:-)
1 ответ
Вместо того, чтобы изобретать велосипед, вы можете использовать библиотеку, а именно: https://code.google.com/p/java-diff-utils/
Вы можете использовать его метод DiffUtils.diff, добавляя предложения в качестве входных данных, он должен делать именно то, что вы хотите достичь, см. Тест ниже.
import difflib.Delta;
import difflib.DiffUtils;
import difflib.Patch;
import org.junit.Test;
import java.util.Arrays;
public class DiffUtilsTest {
public String note1 = "Sentence 1, sentence 2, sentence 3, sentence 4";
public String note2 = "Sentence 1, sentence 3, sentence 5";
@Test
public void testDiff() {
Patch<String> patch = DiffUtils.diff(Arrays.asList(note1.split("[\\.,]")), Arrays.asList(note2.split("[\\.,]")));
for (Delta<String> delta: patch.getDeltas()) {
System.out.println(delta);
};
//outputs
//[DeleteDelta, position: 1, lines: [ sentence 2]]
//[ChangeDelta, position: 3, lines: [ sentence 4] to [ sentence 5]]
}
}