Тесты проходит, помогите найти ошибку, для проверки в коде можно раскомментировать toString и строку вывода для результата
а вот рекомендации от ментора валидатора
Убедись, что список lines в нужных местах содержит операции REMOVED c нужными строками.
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.Arrays;
import java.util.List;
/*
Отслеживаем изменения
*/
public class Solution {
//3. Класс Solution должен содержать публичное статическое поле lines типа List, которое сразу проинициализировано.
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) throws IOException {
//4. В методе main(String[] args) программа должна считывать имена файлов с консоли (используй BufferedReader).
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = bufferedReader.readLine();
String fileName2 = bufferedReader.readLine();
//5. В методе main(String[] args) BufferedReader для считывания данных с консоли должен быть закрыт.
bufferedReader.close();
//6. Программа должна считывать содержимое первого и второго файла (используй FileReader).
ArrayList<String> linesFile1 = new ArrayList<>(); //строки из перовго файла
ArrayList<String> linesFile2 = new ArrayList<>(); //строки из перовго файла
//--- чтение первого файла
FileReader fileReader1 = new FileReader(fileName1);
loadFileLines(fileReader1,linesFile1);
//--- чтение второго файла
FileReader fileReader2 = new FileReader(fileName2);
loadFileLines(fileReader2,linesFile2);
//7. Потоки чтения из файлов (FileReader) должны быть закрыты.
fileReader1.close();
fileReader2.close();
//8. Список lines должен содержать объединенную версию строк из файлов, где для каждой строки указана одна из операций ADDED, REMOVED, SAME.
//--- проверка удаления срок со второго файла и наличия одинаковых строк
Type lastType=null;
boolean endSame = false; //закончились все совпадающие строки
boolean endAdded = false; //закончились все строки для добавления
boolean endRemove = false; //закончились все строки которые удаляются
boolean whileAdded=true;
//устанавливаем начальный обртаный тип операции, чтобы первая операция обратная установленной
if ( linesFile1.size()>0 ) {
boolean bSame = false;
for (int j = 0; j < linesFile2.size() && !bSame; j++)
bSame = linesFile1.get(0).equals(linesFile2.get(j));
lastType = (bSame) ? Type.REMOVED : Type.SAME;
}
//проверяем все строки
while ((linesFile1.size()>0 || linesFile2.size()>0) && whileAdded) {
whileAdded = false;
//--- 1) поиск SAME операции
if (!endSame && (lastType == Type.ADDED || lastType == Type.REMOVED || (endAdded && endRemove))) {
boolean bSame = false;
for (int i = 0; i < linesFile1.size() && !bSame; i++)
for (int j = 0; j < linesFile2.size() && !bSame; j++)
if ( bSame = linesFile1.get(i).equals(linesFile2.get(j)) ) {
whileAdded = lines.add(new LineItem(lastType = Type.SAME, linesFile1.get(i)));
linesFile1.remove(i);
linesFile2.remove(j);
}
endSame = (lastType != Type.SAME);
}
//--- 2) поиск REMOVE операции
if (!whileAdded && !endRemove && (lastType == Type.SAME || (endSame && (lastType == Type.ADDED || endAdded)))) {
for (int i = 0; i < linesFile1.size(); i++) {
boolean bSame = false;
for (int j = 0; j < linesFile2.size() && !bSame; j++)
bSame = linesFile1.get(i).equals(linesFile2.get(j));
if (!bSame) {
whileAdded = lines.add(new LineItem(lastType = Type.REMOVED, linesFile1.get(i)));
linesFile1.remove(i);
break;
}
}
endRemove = (lastType != Type.REMOVED);
}
//--- 3) поиск ADDED операции
if (!whileAdded && !endAdded && (lastType == null || lastType == Type.SAME || (endSame && (lastType == Type.REMOVED || endRemove)))) {
for (int i = 0; i < linesFile2.size(); i++) {
boolean bSame = false;
for (int j = 0; j < linesFile1.size() && !bSame; j++)
bSame = linesFile2.get(i).equals(linesFile1.get(j));
if (!bSame) {
whileAdded = lines.add(new LineItem(lastType = Type.ADDED, linesFile2.get(i)));
linesFile2.remove(i);
break;
}
}
endAdded = (lastType != Type.ADDED);
}
}
// lines.stream().forEach( System.out::println );
}
//2. Класс Solution должен содержать enum Type.
public static enum Type {
ADDED, //добавлена новая строка
REMOVED, //удалена строка
SAME //без изменений
}
//1. Класс Solution должен содержать класс LineItem.
public static class LineItem {
public Type type;
public String line;
public LineItem(Type type, String line) {
this.type = type;
this.line = line;
}
/*public String toString() {
String sType = "xxx";
switch (this.type){
case ADDED:sType="ADDED";break;
case REMOVED:sType="REMOVED";break;
case SAME:sType="SAME";break;
}
return sType + " "+this.line;
}*/
}
public static void loadFileLines(FileReader fileReader, ArrayList<String> arrayList) throws IOException {
String divBlock=""; //остаток от последнего считанного блока
char[] arrayChars = new char[1024]; //байтовый блок буфер чтения
while ( fileReader.ready() ) {
int countRead = fileReader.read(arrayChars);
if ( countRead<1024 )
arrayChars = Arrays.copyOf(arrayChars, countRead);
String[] arrayLines = (divBlock + (new String(arrayChars))).split(System.lineSeparator());
for ( int i = 0; i < arrayLines.length-1; i++)
arrayList.add(arrayLines[i]);
divBlock = (arrayLines.length<=0)?"":arrayLines[arrayLines.length-1]; //остаток - это последний элемент
}
if ( divBlock.length()>0 )
arrayList.add(divBlock);
}
}