переписал задачу на 2 блока if и контроль строк... и чтобы избежать ArrayOutOfIndexException после основного блока while прописал все 5 сценариев.
Но валидатор зависает и не принимает (timeout). Подскажите хоть в какую сторону двигаться, а то уже мучаюсь с этой задачей... принципиально добить надо
package com.javarush.task.task19.task1916;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/*
Отслеживаем изменения
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static void main(String[] args) {
String fileOne = "", fileTwo = "";
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
fileOne = br.readLine();
fileTwo = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
List<String> fStr = new ArrayList<>();
List<String> sStr = new ArrayList<>();
try (Scanner sc1 = new Scanner(new FileReader(fileOne));
Scanner sc2 = new Scanner(new FileReader(fileTwo))) {
while (sc1.hasNextLine()){
fStr.add(sc1.nextLine());
}
while (sc2.hasNextLine()){
sStr.add(sc2.nextLine());
}
int oneCounter = 0, twoCounter = 0;
while (oneCounter< fStr.size()-1 && twoCounter< sStr.size()-1){
if (fStr.get(oneCounter).equals(sStr.get(twoCounter))){
lines.add(new LineItem(Type.SAME,fStr.get(oneCounter)));
oneCounter++;
twoCounter++;
} else if (fStr.get(oneCounter).equals(sStr.get(twoCounter+1))){
lines.add(new LineItem(Type.ADDED,sStr.get(twoCounter)));
lines.add(new LineItem(Type.SAME,sStr.get(twoCounter+1)));
twoCounter += 2;
oneCounter++;
} else {
lines.add(new LineItem(Type.REMOVED,fStr.get(oneCounter)));
lines.add(new LineItem(Type.SAME, fStr.get(oneCounter+1)));
oneCounter += 2;
twoCounter++;
}
}
if (oneCounter == fStr.size()-1 && twoCounter == sStr.size()){
lines.add(new LineItem(Type.REMOVED,fStr.get(oneCounter)));
} else if (twoCounter == sStr.size()-1 && oneCounter == fStr.size()) {
lines.add(new LineItem(Type.ADDED, sStr.get(twoCounter)));
} else if (twoCounter == sStr.size()-2 && oneCounter == fStr.size()-1){
if (fStr.get(oneCounter).equals(sStr.get(twoCounter))){
lines.add(new LineItem(Type.SAME, fStr.get(oneCounter)));
lines.add(new LineItem(Type.ADDED, sStr.get(twoCounter+1)));
} else {
lines.add(new LineItem(Type.ADDED, sStr.get(twoCounter)));
lines.add(new LineItem(Type.SAME, fStr.get(oneCounter)));
}
} else if (oneCounter == fStr.size()-2 && twoCounter == sStr.size()-1){
if (fStr.get(oneCounter).equals(sStr.get(twoCounter))){
lines.add(new LineItem(Type.SAME, fStr.get(oneCounter)));
lines.add(new LineItem(Type.REMOVED, fStr.get(oneCounter+1)));
} else {
lines.add(new LineItem(Type.REMOVED, fStr.get(oneCounter)));
lines.add(new LineItem(Type.SAME, fStr.get(oneCounter+1)));
}
} else if (oneCounter == fStr.size()-1 && twoCounter == sStr.size()-1){
lines.add(new LineItem(Type.SAME,fStr.get(oneCounter)));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (LineItem s: lines){
System.out.println(s.type+" "+ s.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;
}
}
}