Понимаю, что в ЭТОЙ задаче едва ли кто-то захочет разбираться.
И все-таки...
Программа работает исправно. Протестировал.
Работает, если в первом файле больше данных.
Работает, если во втором файле больше данных,
Работает, если оба файла заканчиваются одинаковой строкой.
Работает, если файлы заканчиваются разными строками.
Потоки все закрыл.
Какие еще тесты надо прогнать, чтобы найти ошибку?
Почему TimeOut ?
package com.javarush.task.task19.task1916;
import java.io.BufferedReader;
import java.io.FileReader;
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 ArrayList<String> listFile1 = new ArrayList<>();
public static ArrayList<String> listFile2 = new ArrayList<>();
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = reader.readLine();
String fileName2 = reader.readLine();
reader.close();
//переписываем строки файлов в List
readToList(listFile1, fileName1);
readToList(listFile2, fileName2);
int list1Counter = 0;
int list2Counter = 0;
while (list1Counter < listFile1.size() && list2Counter < listFile2.size()) {
if (listFile1.get(list1Counter).equals(listFile2.get(list2Counter))) {
//добавляем строку в итоговый список при равенстве элементов
lines.add(new LineItem(Type.SAME, listFile1.get(list1Counter)));
list1Counter = list1Counter + 1;
list2Counter = list2Counter + 1;
}
else {
if (list1Counter == listFile1.size()-1 || list2Counter == listFile2.size()-1) {
//на случай, если в одном списке элементы кончились, а в другом еще есть
//пригождается, когда два последних элемента равны
if (list2Counter == listFile2.size() - 2) {
lines.add(new LineItem(Type.ADDED, listFile2.get(list2Counter)));
++list2Counter;
}
if (list1Counter == listFile1.size() - 2) {
lines.add(new LineItem(Type.REMOVED, listFile1.get(list1Counter)));
++list1Counter;
}
}
else {
//добавляем строку в итоговый список при НЕравенстве элементов
//и при условии, что в обоих списках еще есть хотя бы текущий + 1 элемент
if (listFile1.get(list1Counter).equals(listFile2.get(list2Counter + 1))) {
lines.add(new LineItem(Type.ADDED, listFile2.get(list2Counter)));
list2Counter = list2Counter + 1;
}
if (listFile1.get(list1Counter + 1).equals(listFile2.get(list2Counter))) {
lines.add(new LineItem(Type.REMOVED, listFile1.get(list1Counter)));
list1Counter = list1Counter + 1;
}
}
}
}
//внимание, костыль!
//на случай, когда один из списков закончился и мы вышли из цикла
//но в другом списке еще есть элемент
if (list2Counter == listFile2.size() - 1) {
lines.add(new LineItem(Type.ADDED, listFile2.get(list2Counter)));
}
if (list1Counter == listFile1.size() - 1) {
lines.add(new LineItem(Type.REMOVED, listFile1.get(list1Counter)));
}
}
private static void readToList(ArrayList<String> listFile, String fileName) throws Exception {
FileReader fr = new FileReader(fileName);
StringBuilder sb = new StringBuilder("");
char temp = 0;
while (fr.ready()){
temp = (char) fr.read();
if (temp != '\n'){
sb.append(temp);
}
else {
listFile.add(sb.toString());
sb = new StringBuilder("");
}
}
fr.close();
}
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;
}
}
}