Различить две строки построчно в Java, используя Diff-Match-Patch - PullRequest
0 голосов
/ 25 февраля 2020

Я искал простой способ сделать Myers Diff на двух строках построчно в Java.

Согласно this , Google diff Библиотека -match-patch имеет эту функцию. Но в версии Java упомянутые методы защищены и / или защищены пакетами!

Я не смог найти другую библиотеку, которая (1) делает это, и (2) выглядит хорошо поддерживается.

Так что я в конечном итоге использовал рефлексию, чтобы заставить Google сделать это. Я хочу, чтобы никому не пришлось заново его внедрять, поэтому я опубликую то, что я сделал, в качестве ответа.

1 Ответ

0 голосов
/ 25 февраля 2020

Вот код, который я придумал. Не стесняйтесь редактировать / исправлять.

Я не уверен в каких-либо лучших методах для размышления (кроме «не»), но я определенно хотел бы узнать, если у кого-то есть мысли.

List<Diff> diff = new diff_match_patch() {
    // anonymous extension
    List<Diff> getLineDiff(String a, String b) throws NoSuchFieldException, IllegalAccessException {
        LinesToCharsResult res = this.diff_linesToChars(a, b);

        // extract protected fields
        Class<?> clazz = res.getClass();
        Field chars1 = clazz.getDeclaredField("chars1");
        Field chars2 = clazz.getDeclaredField("chars2");
        Field lineArray = clazz.getDeclaredField("lineArray");
        chars1.setAccessible(true);
        chars2.setAccessible(true);
        lineArray.setAccessible(true);

        // follow the docs https://github.com/google/diff-match-patch/wiki/Line-or-Word-Diffs
        String chars1Inst = (String) chars1.get(res);
        String chars2Inst = (String) chars2.get(res);
        List<String> lineArrayInst = (List<String>) lineArray.get(res);
        LinkedList<Diff> diff = this.diff_main(chars1Inst, chars2Inst, false);

        // convert back to original strings
        this.diff_charsToLines(diff, lineArrayInst);

        return diff;
    }
}.getLineDiff(expected, output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...