Сравнение двух строк и выделение различий
Всем привет,имеется такой код(кривой косой,но что-то даже выводит) Подскажите пожалуйста идиоту,как его модифицировать?
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 шт):
Ваш код только для букв. для вашей второй задачи нужно будет смотреть есть ли в приложении пробел и создавать массив из слов
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);
}
Всем спасибо за помощь! Спасла данная либа 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("&", "&").replace("<", "<")
.replace(">", ">").replace("\n", "¶<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
Но я не думаю что кому-то это будет необходимо.

