Помогите найти причину проблемы с Валидатором.
Результат по примеру в условии - верный.
package com.javarush.task.task19.task1918;
/*
Знакомство с тегами
*/
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static void main(String[] args) throws IOException {
if (args.length == 0) {
System.out.println("Empty arguments");
return;
}
String SearchTeg = args[0];
// +debug
/*
ByteArrayInputStream bIS = new ByteArrayInputStream("D:\\JavaRush\\JavaRushTasks\\2.JavaCore\\src\\com\\javarush\\task\\task19\\task1918\\file.html\n".getBytes());
InputStream SystemIn = System.in;
System.setIn(bIS);
*/
// -debug
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String FileName = reader.readLine();
reader.close();
File file = new File(FileName);
char[] CharBuffer = new char[(int) file.length()];
FileReader fileReader = new FileReader(file);
BufferedReader fileBufferedReader = new BufferedReader(fileReader);
fileBufferedReader.read(CharBuffer);
fileBufferedReader.close();
fileReader.close();
String ContentFile = String.valueOf(CharBuffer).replaceAll("\\n|\\r\\n|\\t", "");
List<Teg> listTeg = GetListTeg(ContentFile, SearchTeg);
for (Teg teg : listTeg) {
teg.PrintTeg(ContentFile);
}
// +debug
/*
System.setIn(SystemIn);
bIS.close();
*/
// -debug
}
private static List<Integer> GetPointers(String ContentFile, String SearchTeg) {
List<Integer> listPointersTeg = new ArrayList<>();
int fromIndex = 0;
int PointerNextTeg = 0;
while (true) {
PointerNextTeg = ContentFile.indexOf(SearchTeg, fromIndex);
if (PointerNextTeg == -1) {
break;
}
listPointersTeg.add(PointerNextTeg);
fromIndex = PointerNextTeg + 1;
}
return listPointersTeg;
}
private static boolean ThisTegAlreadyAdd(List<Teg> listTeg, int StartOrEnd) {
boolean result = false;
for (Teg teg : listTeg) {
if (teg.Start == StartOrEnd || teg.End == StartOrEnd) {
result = true;
break;
}
if (!result) {
result = ThisTegAlreadyAdd(teg.Child, StartOrEnd);
}
}
return result;
}
private static List<Teg> GetListTeg(String ContentFile, String SearchTeg) {
List<Teg> listTegs = new ArrayList<>();
List<Integer> listPointersOpenTeg = GetPointers(ContentFile, "<" + SearchTeg);
List<Integer> listPointersCloseTeg = GetPointers(ContentFile, "</" + SearchTeg + ">");
for (int OpenTeg : listPointersOpenTeg) {
if (!ThisTegAlreadyAdd(listTegs, OpenTeg)) {
List<Teg> childTegs = new ArrayList<>(0);
for (int CloseTeg : listPointersCloseTeg) {
boolean serarchNextCloseTeg = false;
if (CloseTeg > OpenTeg) {
// Поищим вдруг это озакрывающий Тег ребенка
for (int OpenTegChild : listPointersOpenTeg) {
if (OpenTegChild > OpenTeg && OpenTegChild < CloseTeg) {
if (!ThisTegAlreadyAdd(listTegs, CloseTeg) && !ThisTegAlreadyAdd(childTegs, CloseTeg) && !ThisTegAlreadyAdd(listTegs, OpenTegChild) && !ThisTegAlreadyAdd(childTegs, OpenTegChild)) {
childTegs.add(new Teg(SearchTeg, OpenTegChild, CloseTeg));
serarchNextCloseTeg = true;
}
continue;
}
}
if (!serarchNextCloseTeg) {
listTegs.add(new Teg(SearchTeg, OpenTeg, CloseTeg, childTegs));
break;
}
}
}
}
}
return listTegs;
}
static class Teg {
private int Start;
private int End;
private List<Teg> Child = new ArrayList<>(0);
private String NameTeg;
public Teg(String NameTeg, int Start, int End) {
this.NameTeg = NameTeg;
this.Start = Start;
this.End = End;
}
public Teg(String NameTeg, int Start, int End, List<Teg> Children) {
this.NameTeg = NameTeg;
this.Start = Start;
this.End = End;
this.Child = Children;
}
public void PrintTeg(String Content) {
System.out.println(Content.substring(this.Start, this.End + ("</" + this.NameTeg + ">").length()));
}
}
}