Логику алгоритма развил до предела. Если есть идеи как заменить способ разделения, буду благодарен
Внутренние теги выводит верно, несоответствующие теги не выводит, \n и \r не влияет, лишние пробелы так же
Пустые блоки - лучше метода для игнора не знаю
блок с игнором ошибки - для продолжения алгоритма
package com.javarush.task.task19.task1918;
/*
Знакомство с тегами
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
reader.close();
ArrayList<Character> chars = new ArrayList<>();
FileReader fileReader = new FileReader(fileName);
StringBuilder string = new StringBuilder();
while (fileReader.ready()) {
char reads = (char) fileReader.read();
if (reads != '\n' && reads != '\r') {
chars.add(reads);
}
}
fileReader.close();
string.append(chars.get(0));
for (int i = 1; i < chars.size(); i++) {
if (chars.get(i) == ' ' && chars.get(i-1) == ' ') {
}
else string.append(chars.get(i));
}
String[] data = string.toString().split(">");
String tag = args[0];
data[0] = data[0].substring(data[0].indexOf('<'));
alrorithm(data, tag);
}
public static void alrorithm(String[] data, String tag) {
int count = 0;
StringBuilder insideTags = new StringBuilder();
try {
for (int i = 0; i < data.length; i++) {
if (data[i].contains("</" + tag) && count == 1) {
System.out.println(data[i] + ">");
if (!data[i].equals("</" + tag)) {
insideTags.append(data[i], 0, data[i].indexOf("<"));
}
multiTags(insideTags.toString(), tag);
insideTags = new StringBuilder();
count--;
} else if (data[i].contains("</" + tag) && count > 1) {
System.out.print(data[i] + ">");
insideTags.append(data[i]).append(">");
count--;
} else if (data[i].contains("<" + tag) && count > 0) {
System.out.print(data[i] + ">");
insideTags.append(data[i]).append(">");
count++;
} else if (data[i].contains("<" + tag)) {
System.out.print(data[i] + ">");
count++;
} else if (data[i].contains("<") && count == 0){
}
else if (data[i].contains("<")) {
System.out.print(data[i] + ">");
if (data[i + 1].contains("<" + tag)) {
System.out.print("\n");
}
} else {
System.out.print(data[i]);
if (count > 0) {
insideTags.append(data[i]);
}
}
}
} catch (ArrayIndexOutOfBoundsException ignored) {
}
}
public static void multiTags(String str, String tag) {
String text = str;
String forLength = "<" + tag + ">";
int f = forLength.length();
while (!text.equals("")) {
if (!text.contains("<" + tag + ">") && !text.contains("</" + tag + ">")) {
break;
}
System.out.println(text);
text = text.substring((text.indexOf("<" + tag + ">") + f) , text.lastIndexOf("</" + tag + ">"));
}
}
}