Список lines должен содержать объединенную версию строк из файлов, где для каждой строки указана одна из операций ADDED, REMOVED, SAME.
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;
/*
Отслеживаем изменения
*/
/*
Так как задача одна из самых сложных из всех до 19 лвл включительно, плюс пример в условии приведен с ошибкой, решил облегчить мучения будущих джаварашевцев. Надеюсь цвет ячеек даст вам намек на то что в цикле каждую строку файла1 сравниваем со строкой №1 файла2, если равны то SAME, если нет то сравниваем со строкой №2 файла2 если равны то строка №1 файла2 ADDED, если не равны то текущая строка файла1 REMOVED. В случаях SAME и ADDED нулевую строку файла2 удаляем. Ну и сложные условия проверок равенства вы сами додумаете чем дополнить если файл2 уже пуст.
Да и забыл добавить, в случае ADDED минусуем переменную цикла.
*/
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));
String file1 = reader.readLine();
String file2 = reader.readLine();
reader.close();
//C:\Java\task1916\file1.txt
//C:\Java\task1916\file2.txt
BufferedReader fileReader1 = new BufferedReader(new FileReader(file1));
List<String> listOfFile1 = new ArrayList<String>();
String lineF1 = fileReader1.readLine();
if( lineF1!=null) {
do {
listOfFile1.add(lineF1);
lineF1 = fileReader1.readLine();
}
while (lineF1 != null);
}
fileReader1.close();
BufferedReader fileReader2 = new BufferedReader(new FileReader(file2));
List<String> listOfFile2 = new ArrayList<String>();
String lineF2 = fileReader2.readLine();
if( lineF2!=null) {
do {
listOfFile2.add(lineF2);
lineF2 = fileReader2.readLine();
}
while (lineF2 != null);
}
fileReader2.close();
int length1F = listOfFile1.size();
int length2F = listOfFile2.size();
// System.out.println(length2F);
int indexOf2File = 0;
int indexOf1File = 0;
boolean haveNextIntx = true;
if(length2F==0){
for(String st : listOfFile1){
lines.add(new LineItem(Type.REMOVED,st));
}
}
else {
haveNextIntx = 1 < listOfFile2.size();
for(int i=0;i<length1F;i++){
if(listOfFile2.size()==0){
indexOf1File = i;
break;
}
if(listOfFile1.get(i).equals(listOfFile2.get(indexOf2File))){
lines.add(new LineItem(Type.SAME,listOfFile1.get(i)));
listOfFile2.remove(indexOf2File);
}
else if (haveNextIntx){
if(listOfFile1.get(i).equals(listOfFile2.get(indexOf2File+1))){
lines.add(new LineItem(Type.ADDED,listOfFile2.get(indexOf2File+1)));
lines.add(new LineItem(Type.SAME,listOfFile1.get(i)));
listOfFile2.remove(indexOf2File);
listOfFile2.remove(indexOf2File+1);
}
else {
lines.add(new LineItem(Type.REMOVED,listOfFile1.get(i)));
}
}
else {
lines.add(new LineItem(Type.REMOVED,listOfFile1.get(i)));
indexOf1File = i+1;
break;
}
}
}
//System.out.println(lines.size());
if(indexOf1File!=length1F && indexOf1File<length1F){
while(indexOf1File<length1F){
lines.add(new LineItem(Type.REMOVED,listOfFile1.get(indexOf1File)));
indexOf1File++;
}
}
if(listOfFile2.size()!=0){
for(int i = 0 ; i<listOfFile2.size()-1;i++){
lines.add(new LineItem(Type.ADDED,listOfFile2.get(i)));
}
}
}
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;
}
}
}