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

    }
}
Другие вопросы по тегам