Придумал следующий вариант:
Записал два файла в отдельные списки. (назвал added и removed)
Сравнил списки на совпадения строк и если есть совпадения, то строку копировал в третий список same, а из added и removed эту строку удалял.
В результате получил три отдельных списка :
то что осталось в оригинальном - removed
то что в редактируемом - added
и то что совпало - same
Потом через цикл все добавил в lines и чередовал same
для проверки:
файл1 -
t1
t2
t3
t4
t5
файл2 -
t2
t6
t4
t
результат
SAME t4
REMOVED t1
SAME t2
REMOVED t3
SAME t4
REMOVED t5
SAME t2
ADDED t6
SAME t4
ADDED t
package com.javarush.task.task19.task1916;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/*
Отслеживаем изменения
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader file1 = new BufferedReader(new FileReader(reader.readLine()));
BufferedReader file2 = new BufferedReader(new FileReader(reader.readLine()));
reader.close();
ArrayList<String> removed = new ArrayList<>();
while (file1.ready()){
removed.add(file1.readLine());
}
file1.close();
ArrayList<String> added = new ArrayList<>();
while (file2.ready()){
added.add(file2.readLine());
}
file2.close();
ArrayList<String> same = new ArrayList<>();
for (int i = removed.size()-1; i >= 0 ; i--) {
for (int j = added.size()-1; j >=0 ; j--) {
if (removed.get(i).equals(added.get(j))){
same.add(removed.get(i));
removed.remove(i);
added.remove(j);
break;
}
}
}
int j = 0;
int r = 0;
int t = 0;
for (int i = 0; true ; i++) {
if (j>=same.size()){
r++;
j=0;}
if (r>0&&i>=removed.size()&&t>=added.size())break;
lines.add(new LineItem(Type.SAME,same.get(j)));
j++;
if (i<removed.size()) { lines.add(new LineItem(Type.REMOVED, removed.get(i))); }
else {
if (t < added.size()) {
lines.add(new LineItem(Type.ADDED, added.get(t)));
t++;
}
}
}
}
public static enum Type {
ADDED, //добавлена новая строка
REMOVED, //удалена строка
SAME //без изменений
}
public static class LineItem {
public Type type;
public String line;
public LineItem(Type type, String line) {
this.type = type;
this.line = line;
}
}
}