public class Solution {
public static List<LineItem> lines = new ArrayList<LineItem>();
public static List<String> linesOfFile1 = new ArrayList<>();
public static List<String> linesOfFile2 = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String file1 = br.readLine();
String file2 = br.readLine();
br.close();
StringBuilder sb = new StringBuilder();
int byteOfLine;
try (FileReader fr1 = new FileReader(file1);
FileReader fr2 = new FileReader(file2)) {
while (fr1.ready()) { // заполняю linesOfFile1 – прочитанное из файла 1
byteOfLine = fr1.read();
if (byteOfLine == '\r') {
fr1.read();
linesOfFile1.add(sb.toString());
sb = new StringBuilder();
continue;
}
sb.append((char)byteOfLine);
}
if (sb.length() != 0) {
linesOfFile1.add(sb.toString());
sb = new StringBuilder();
}
linesOfFile1.add(""); // для удобства дальнейших расчётов дополняю список пустой строкой
while (fr2.ready()) { // заполняю linesOfFile2 – прочитанное из файла 2
byteOfLine = fr2.read();
if (byteOfLine == '\r') {
fr2.read();
linesOfFile2.add(sb.toString());
sb = new StringBuilder();
continue;
}
sb.append((char)byteOfLine);
}
if (sb.length() != 0)
linesOfFile2.add(sb.toString());
linesOfFile2.add("");
}
int min = (linesOfFile1.size() < linesOfFile2.size()) ? linesOfFile1.size() : linesOfFile2.size();
for (int i = 0, j = 0; (i < min) && (j < min); i++, j++) {
if (linesOfFile1.get(i).equals(linesOfFile2.get(j)))
lines.add(new LineItem(Type.SAME, linesOfFile1.get(i)));
else if (j == linesOfFile2.size() - 1)
break;
else if (linesOfFile1.get(i).equals(linesOfFile2.get(j + 1))) {
lines.add(new LineItem(Type.ADDED, linesOfFile2.get(j)));
lines.add(new LineItem(Type.SAME, linesOfFile1.get(i)));
j++;
} else if (i == linesOfFile1.size() - 1)
break;
else if (linesOfFile1.get(i + 1).equals(linesOfFile2.get(j))) {
lines.add(new LineItem(Type.REMOVED, linesOfFile1.get(i)));
lines.add(new LineItem(Type.SAME, linesOfFile1.get(i + 1)));
i++;
}
}
if (linesOfFile1.size() == linesOfFile2.size()) // удаляю из lines ранее добавленную пустую строку
lines.remove(lines.size() - 1);
if (linesOfFile1.size() > linesOfFile2.size())
for (int i = linesOfFile2.size(); i < linesOfFile1.size() - 1; i++)
lines.add(new LineItem(Type.REMOVED, linesOfFile1.get(i)));
else
for (int j = linesOfFile1.size(); j < linesOfFile2.size() - 1; j++)
lines.add(new LineItem(Type.ADDED, linesOfFile2.get(j)));
}
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;
}
}
}
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 List<String> linesOfFile1 = new ArrayList<>();
public static List<String> linesOfFile2 = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String file1 = br.readLine();
String file2 = br.readLine();
br.close();
StringBuilder sb = new StringBuilder();
int byteOfLine;
try (FileReader fr1 = new FileReader(file1);
FileReader fr2 = new FileReader(file2)) {
while (fr1.ready()) {
byteOfLine = fr1.read();
if (byteOfLine == '\r') {
fr1.read();
linesOfFile1.add(sb.toString());
sb = new StringBuilder();
continue;
}
sb.append((char)byteOfLine);
}
if (sb.length() != 0) {
linesOfFile1.add(sb.toString());
sb = new StringBuilder();
}
linesOfFile1.add("");
while (fr2.ready()) {
byteOfLine = fr2.read();
if (byteOfLine == '\r') {
fr2.read();
linesOfFile2.add(sb.toString());
sb = new StringBuilder();
continue;
}
sb.append((char)byteOfLine);
}
if (sb.length() != 0)
linesOfFile2.add(sb.toString());
linesOfFile2.add("");
}
int min = (linesOfFile1.size() < linesOfFile2.size()) ? linesOfFile1.size() : linesOfFile2.size();
for (int i = 0, j = 0; (i < min) && (j < min); i++, j++) {
if (linesOfFile1.get(i).equals(linesOfFile2.get(j)))
lines.add(new LineItem(Type.SAME, linesOfFile1.get(i)));
else if (j == linesOfFile2.size() - 1)
break;
else if (linesOfFile1.get(i).equals(linesOfFile2.get(j + 1))) {
lines.add(new LineItem(Type.ADDED, linesOfFile2.get(j)));
lines.add(new LineItem(Type.SAME, linesOfFile1.get(i)));
j++;
} else if (i == linesOfFile1.size() - 1)
break;
else if (linesOfFile1.get(i + 1).equals(linesOfFile2.get(j))) {
lines.add(new LineItem(Type.REMOVED, linesOfFile1.get(i)));
lines.add(new LineItem(Type.SAME, linesOfFile1.get(i + 1)));
i++;
}
}
if (linesOfFile1.size() == linesOfFile2.size())
lines.remove(lines.size() - 1);
if (linesOfFile1.size() > linesOfFile2.size())
for (int i = linesOfFile2.size(); i < linesOfFile1.size() - 1; i++)
lines.add(new LineItem(Type.REMOVED, linesOfFile1.get(i)));
else
for (int j = linesOfFile1.size(); j < linesOfFile2.size() - 1; j++)
lines.add(new LineItem(Type.ADDED, linesOfFile2.get(j)));
}
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;
}
}
}