Код вроде бы рабочий (испытан множеством примеров).
Дело такое - мой код проверяет, есть ли "строка первого файла" во втором файле в принципе, а не на таком же месте, что и в первом файле.
Т.е. в примере из условия есть одна "строка4" - ADDED (в первом файле), а другая во втором - REMOVED в другом месте. Мой код из них делает одну - SAME.
Я так понимаю, программа должна работать несколько иначе, и проверять строки "друг напротив друга".
Тогда не понятно почему в примере ниже (с учётом отсутствия пустых строк) программа должна вести себя именно так, а не иначе.
строка1 строка1 SAME строка1
строка2 REMOVED строка2
строка3 строка3 SAME строка3
строка4 REMOVED строка4
Т.е. "строка2" будет напротив "строка3" - почему REMOVED строка2, а не ADDED строка3?
Напротив же "строки3" будет "строка5" - из условия видим результат: SAME "строка3".
Как в этом разобраться?
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 {
List<LineItem> lines2 = new ArrayList<>();
List<String> listFile1 = new ArrayList<>();
List<String> listFile2 = new ArrayList<>();
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = r.readLine();
String fileName2 = r.readLine();
r.close();
BufferedReader readerFile1 = new BufferedReader(new FileReader(fileName1));
String s1 = null;
while ((s1=readerFile1.readLine()) != null) {
listFile1.add(s1);
}
readerFile1.close();
BufferedReader readerFile2 = new BufferedReader(new FileReader(fileName2));
String s2 = null;
while ((s2=readerFile2.readLine()) != null) {
listFile2.add(s2);
}
readerFile2.close();
List<String> listFile11 = listFile1;
List<String> listFile22 = listFile2;
for(int i=0; i<listFile1.size(); i++) {
for(int j=0; j<listFile2.size(); j++) {
if(listFile1.get(i).equals(listFile2.get(j))) {
lines2.add(new LineItem(Type.SAME, listFile1.get(i)));
listFile2.set(j, null);
listFile1.set(i, null);
break;
}
}
}
for(int i=0; i<listFile2.size(); i++) {
for(int j=0; j<listFile11.size(); j++) {
if(listFile2.get(i) != null) {
if((!listFile2.get(i).equals(listFile11.get(j)))) {
lines2.add(new LineItem(Type.ADDED, listFile2.get(i)));
break;
}
}
}
}
for(int i=0; i<listFile1.size(); i++) {
for(int j=0; j<listFile22.size(); j++) {
if(listFile1.get(i) != null) {
if((!listFile1.get(i).equals(listFile22.get(j)))) {
lines2.add(new LineItem(Type.REMOVED, listFile1.get(i)));
break;
}
}
}
}
for(int i=0; i<lines2.size(); i++){
lines.add(null);
}
for(int i=0; i<lines.size(); i++) {
for(int j=0; j<lines2.size(); j++) {
if((i%2!=0) && (lines2.get(j) != null)) {
if(lines2.get(j).type==Type.REMOVED || lines2.get(j).type==Type.ADDED) {
lines.set(i, lines2.get(j));
lines2.set(j, null);
break;
}
}
}
}
for(int i=0; i<lines.size(); i++) {
for(int j=0; j<lines2.size(); j++) {
if(lines2.get(j) != null) {
if(i%2==0) {
lines.set(i, lines2.get(j));
lines2.set(j, null);
break;
}
}
}
}
}
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;
}
}
}