0

我正在开发一个用于记笔记的 Java 应用程序。现在,每当用户编辑便笺中的文本时,我都想找出 oldText 和 newText 之间的区别,以便将其添加到该便笺的历史记录中。

为此,我将每个段落拆分为多个字符串,方法是在点处拆分它们。然后我使用 diff-match-patch 比较该字符串列表中的句子。

到目前为止,它可以很好地添加、编辑文本,但是一旦我删除一个句子,就会出现问题。

情况是

old text : sentence1, sentence2, sentence3, sentence4
new Text : sentence1, sentence3, sentence4.

但正因为如此,比较器看到 sentence2 被 sentence3 替换, sentence3 被 sentence4 替换,以此类推。

这不是理想的行为,但我不知道如何纠正这种情况。我将发布我的代码,请让我知道如何正确获取它们之间的差异。

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

请让我知道我能做什么。非常感谢。:-)

4

1 回答 1

0

而不是重新发明轮子,您可以使用一个库,即这个: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]]

    }
}
于 2015-10-27T16:20:24.120 回答