Кто сталкивался с задачей, подскажите, в чем причина, что валидатор не принимает? Тестировал при различных исходных данных, результат выводит верный.
Прописал в коде все возможные условия с которыми сталкивался...
PS: Отлично понимаю, что можно решить через Jsoup, но хочется понять почему валидатор ругается, также хочу отметить, что посмотрел решение на Jsoup которое валидатор принимает. Но я не согласен с валидатором, так как Jsoup преобразует в нежелательный вид, например:
Исходный вариант:
<tag>text1</tag>
<tag text2>text1</tag>
<tag
text2>text1</tag>
JSOUP преобразует, как ->
<tag>text1</tag>
<tag text2>text1</tag>
<tagtext2>text1</tagtext2>
Но! В жизни такая путаница исключена, так как современные браузеры автоматом фиксят данную проблему, а в данном примере мы на прямую обращаемся к файлу (а не по html ссылке), поэтому вывод будет некорректным (смотреть выше). Но (в случае с jsoup) валидатор принимает данное решение (причем я нашёл и другие нестыковки у "Верного", как считает валидатор варианта (между тем, что требуется в условии)).
Мой же код ужасен, но он учитывает проблемы jsoup'а, и на примере выше приведенного, на консоль будет выводить:
<tag>text1</tag>
<tag text2>text1</tag>
<tag text2>text1</tag>
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;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
/*
Знакомство с тегами
*/
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedReader bufferedReader = new BufferedReader(new FileReader(reader.readLine()));
reader.close();
String text = "";
String s;
while ((s = bufferedReader.readLine()) != null) {
text = text + s;
}
bufferedReader.close();
String arr[] = text.split("<" + args[0]);
List<String> list = new ArrayList<>();
for (int i = 1; i < arr.length; i++) {
if (arr[i].split("/" + args[0]).length > 2) {
list.add("<" + args[0] + "" + arr[i].split("/" + args[0] + "")[0] + "/" + args[0] + ">" + arr[i].split("/" + args[0] + "")[1]);
for (int j = 0; j < arr[i].split("/" + args[0]).length - 2; j++) {
list.add("</" + args[0] + ">");
}
} else {
list.add("<" + args[0] + arr[i]);
}
}
List<List<String>> listAll = new ArrayList<>();
for (String xxx : list) {
List<String> tmpList = new ArrayList<>();
tmpList.add(xxx.replace("<<", "<").replace(">>", ">"));
tmpList.add(String.valueOf(xxx.split(args[0]).length - 1));
listAll.add(tmpList);
}
int openTag = 0;
int closeTag = 0;
String textAll = "";
for (int i = 0; i < listAll.size(); i++) {
if (Integer.parseInt(listAll.get(i).get(1)) == 1 && listAll.get(i).get(0).contains("<" + args[0])) {
textAll = textAll + listAll.get(i).get(0);
openTag++;
} else if (Integer.parseInt(listAll.get(i).get(1)) == 1 && listAll.get(i).get(0).contains("</" + args[0])) {
textAll = textAll + listAll.get(i).get(0);
closeTag++;
}
if (Integer.parseInt(listAll.get(i).get(1)) == 2) {
textAll = textAll + listAll.get(i).get(0);
}
if (openTag == closeTag) {
textAll = textAll + "\n";
openTag = 0;
closeTag = 0;
}
}
String arrAll[] = textAll.split("\n");
List<String> list2 = new ArrayList<>();
for (int i = 0; i < arrAll.length; i++) {
if (arrAll[i].split("<" + args[0])[1].substring(0,1).equals(" ") || arrAll[i].split("<" + args[0])[1].substring(0,1).equals(">")) {
list2.add(arrAll[i].replaceAll(">\\s+<", "><").replaceAll("<<", "<").replaceAll(">>", ">"));
}else{
list2.add(arrAll[i].replaceAll(">\\s+<", "><").replace("<" + args[0], "<" + args[0] + " ").replaceAll("<<", "<").replaceAll(">>", ">"));
}
}
for (int i = 0; i < list2.size(); i++) {
if (list2.get(i).split("<" + args[0]).length > 1) {
System.out.println(list2.get(i));
new Solution().pars(list2.get(i), args[0]);
} else {
System.out.println(list2.get(i));
}
}
}
public void pars(String text, String tag) {
String args[] = {tag};
String arr[] = text.split("<" + args[0]);
List<String> list = new ArrayList<>();
for (int i = 1; i < arr.length; i++) {
if (arr[i].split("/" + args[0]).length > 2) {
list.add("<" + args[0] + "" + arr[i].split("/" + args[0] + "")[0] + "/" + args[0] + ">" + arr[i].split("/" + args[0] + "")[1]);
list.add("</" + args[0] + ">");
} else {
list.add("<" + args[0] + arr[i]);
}
}
List<List<String>> listAll = new ArrayList<>();
for (String xxx : list) {
List<String> tmpList = new ArrayList<>();
tmpList.add(xxx.replace("<<", "<").replace(">>", ">"));
tmpList.add(String.valueOf(xxx.split(args[0]).length - 1));
listAll.add(tmpList);
}
String textAll = "";
for (int i = 0; i < listAll.size(); i++) {
if (Integer.parseInt(listAll.get(i).get(1)) == 1 && !listAll.get(i).get(0).equals("</" + args[0] + ">")) {
textAll = textAll + (listAll.get(i).get(0));
for (int j = i + 1; j < listAll.size(); j++) {
textAll = textAll + (listAll.get(j).get(0));
if (listAll.get(j).get(0).equals("</" + args[0] + ">")) {
textAll = textAll + "\n";
break;
}
}
} else if (Integer.parseInt(listAll.get(i).get(1)) != 1) {
if (!listAll.get(i).get(0).equals("</" + args[0] + ">")) {
textAll = "\n" + textAll + (listAll.get(i).get(0)) + "\n";
}
}
}
String arr2[] = textAll.split("\n");
List<String> list2 = new ArrayList<>();
for (int i = 0; i < arr2.length; i++) {
if (!arr2[i].equals("")) {
list2.add(arr2[i].replaceAll("<<", "<").replaceAll(">>", ">"));
}
}
for (int i = 1; i < list2.size(); i++) {
if (list2.get(i).split("/" + args[0])[list2.get(i).split("/" + args[0]).length - 1].equals(">")) {
System.out.println(list2.get(i).replace(">/", "></"));
} else {
System.out.println(list2.get(i).replace(list2.get(i).split("/" + args[0])[list2.get(i).split("/" + args[0]).length - 1], ">").replace(">/", "></"));
}
}
}
}