тестовые примеры работают правильно. Пробовал и другие возможные варианты списков - работает.
Что я не учел??? И почему не закрыты потоки?
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 String readLine(BufferedReader line) throws IOException {
String s = line.readLine();
if (s.matches("\\D+\\d+")) return s;
else if (s.matches("")) s = line.readLine();
return s;
}
private int digit(String s) {
return Integer.parseInt(s.replaceAll("\\D", ""));
}
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();
Solution line = new Solution();
String s1 = file1.readLine();
String s2 = file2.readLine();
while (true) {
int d1 = line.digit(s1);
int d2 = line.digit(s2);
if (d1 == d2) {
lines.add(new LineItem(Type.SAME, s1));
try {
s1 = line.readLine(file1);
} catch (NullPointerException e) {
try {
s2 = line.readLine(file2);
}catch (NullPointerException e1){break;}
lines.add(new LineItem(Type.ADDED, s2));
break;
}
try {
s2 = line.readLine(file2);
} catch (NullPointerException e) {
lines.add(new LineItem(Type.REMOVED, s1));
break;
}
} else if (d1 < d2) {
lines.add(new LineItem(Type.REMOVED, s1));
try {
s1 = line.readLine(file1);
}catch (NullPointerException e){break;}
} else {
lines.add(new LineItem(Type.ADDED, s2));
try{
s2 = line.readLine(file2);
}catch (NullPointerException e){break;}
}
}
file1.close();
file2.close();
for (LineItem l : lines) System.out.println(l.type + " " + l.line);
}
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;
}
}
}