Сравнение двух строк и выделение различий

Всем привет,имеется такой код(кривой косой,но что-то даже выводит) Подскажите пожалуйста идиоту,как его модифицировать?

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String old = editTextStd.getText().toString();
        String edited = editTextAct.getText().toString();
        char[] first  = old.toLowerCase().toCharArray();
        char[] second = edited.toLowerCase().toCharArray();

        int minLength = Math.min(first.length, second.length);
        int count = 0;
        for(int i = 0; i < minLength; i++)
        {
            if (first[i] == second[i])
            {
                Log.e("Test","Совпали: "+first[i]+"|"+second[i]);
            }else{
                Log.e("Test","Разошлись: "+first[i]+"|"+second[i]);
            }
        }
    }
});

Результат его работы:

Совпали: t|t
Совпали: e|e
Совпали: x|x
Совпали: t|t
Разошлись: 1|2

Он выводит совпадения/различия только до длинны минимальной строки

Например: Text1234 и Text123 выведут такой результат:

Совпали: t|t
Совпали: e|e
Совпали: x|x
Совпали: t|t
Совпали: 1|1
Совпали: 2|2
Совпали: 3|3

А вот то что во одном из текстов нет 4 он уже не выдаст.

Как можно его модифицировать,чтобы он выводил различия даже если одна строка длиннее второй? Хочу сделать что-то такое.

Например:

введите сюда описание изображения

То есть те слова которых больше нет выделялись красным,новые зеленым.Совпадающие не трогаем.


Ответы (2 шт):

Автор решения: Tiarait

Ваш код только для букв. для вашей второй задачи нужно будет смотреть есть ли в приложении пробел и создавать массив из слов

if(предложение.contain(" ")) массив = предложение.split(" ");
else массив = new String[]{предложение};

и сравнивать каждый элемент c помощью equalsIgnoreCase

Выделять отдельно символы в тексте можно с помощью html пример или с помощью SpannableString пример

Что касается вашего текущего кода, то вам нужно брать не мин размер а макс.

String old = editTextStd.getText().toString();
    String edited = editTextAct.getText().toString();
    char[] first  = old.toLowerCase().toCharArray();
    char[] second = edited.toLowerCase().toCharArray();

    char[] max = first.length > second.length? first : second;
    for(int i = 0; i < max.length; i++) {
        char cFirst = Character.MIN_VALUE;
        char cSecond = Character.MIN_VALUE;
        if (first.length > i) cFirst = first[i];
        if (second.length > i) cSecond = second[i];

        String p = cFirst == cSecond ? "Совпали: " : "Разошлись: ";
        Log.e("Test", p + cFirst + "|" + cSecond);
    }
→ Ссылка
Автор решения: Nasdomlan Urban3p

Всем спасибо за помощь! Спасла данная либа https://github.com/google/diff-match-patch по совету Alex Skvortsov

И так же спасибо Tiarait за помощь.

введите сюда описание изображения

Как работать с либой:

Скачиваем класс https://github.com/google/diff-match-patch/blob/master/java/src/name/fraser/neil/plaintext/diff_match_patch.java

К себе в проект куда вам удобно,далее импортируем его:

import com.XXX.diff_match_patch;

После чего в коде вызываем таким образом:

 String old = editTextStd.getText().toString();
                String edited = editTextAct.getText().toString();
                diff_match_patch dmp = new diff_match_patch();
                LinkedList<diff_match_patch.Diff> diff = dmp.diff_main(old, edited);
                // Выведет: [(-1, "Hell"), (1, "G"), (0, "o"), (1, "odbye"), (0, " World.")]
                dmp.diff_prettyHtml(diff);
                // Выведет форматированный в HTML код 
                System.out.println(dmp.diff_prettyHtml(diff));

HTML выводит в таком формате:

<del style="background:#ffe6e6;">Удаленный текст</del>

<ins style="background:#e6ffe6;">Добавленный текст</ins>

Я лично советую изменить функцию diff_prettyHtml на такой формат:

   public String diff_prettyHtml(List<Diff> diffs) {
        StringBuilder html = new StringBuilder();
        for (Diff aDiff : diffs) {
            String text = aDiff.text.replace("&", "&amp;").replace("<", "&lt;")
                    .replace(">", "&gt;").replace("\n", "&para;<br>");
            switch (aDiff.operation) {
                case INSERT:
                    html.append("<font color='green'>").append(text)
                            .append("</font>");
                    break;
                case DELETE:
                    html.append("<s><font color='red'>").append(text)
                            .append("</font></s>");
                    break;
                case EQUAL:
                    html.append("<span>").append(text).append("</span>");
                    break;
            }
        }
        return html.toString();
    }

Чтобы андроид сразу принимал все как надо.

Остальные методы вывода текста можно глянуть тут https://github.com/google/diff-match-patch/wiki/API

Но я не думаю что кому-то это будет необходимо.

→ Ссылка