package com.javarush.task.task19.task1918;
import java.io.*;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader1.readLine();
reader1.close();
BufferedReader reader = new BufferedReader(new FileReader(fileName));
ArrayList<String> fileList = new ArrayList<String>();
while (reader.ready()) {
String z = reader.readLine().replaceAll("\\t", "");
fileList.add(z);
}
reader.close();
StringBuffer buffer = new StringBuffer();
for (String x : fileList) {
buffer.append(x);
}
String tag = args[0];
ArrayList<Integer> openTags = new ArrayList<Integer>(); // индексы открывающих тегов
ArrayList<Integer> closeTags = new ArrayList<Integer>(); // индексы закрывающих тегов
Pattern openPattern = Pattern.compile("<("+tag+")"); // паттерн для поиска индексов открывающих тегов
Pattern closePattern = Pattern.compile("</("+tag+")>"); // паттерн для поиска индексов закрывающих тегов
Matcher openMatcher = openPattern.matcher(buffer);
Matcher closeMatcher = closePattern.matcher(buffer); // мэтчеры соответственно
while (openMatcher.find()) { // находим открывающие индексы
openTags.add(openMatcher.start());
}
while (closeMatcher.find()) { // находим закрывающие индексы
closeTags.add(closeMatcher.start());
}
TreeMap<Integer, Boolean> map = new TreeMap<Integer, Boolean>(); // сюда заносим индексы где они сортируются по порядку
for (Integer z : openTags) {
map.put(z, true);
}
for (Integer z : closeTags) {
map.put(z, false);
}
ArrayList<Integer> indexRow = new ArrayList<Integer>(); // здесь индексы отдельно
ArrayList<Boolean> booleanRow = new ArrayList<Boolean>(); // здесь отдельно значения соответственно - true - открывающий индекс, false - закрывающий индекс
for (Map.Entry pair : map.entrySet()) {
indexRow.add((Integer) pair.getKey());
booleanRow.add((Boolean) pair.getValue());
}
int counter = 0; // счётчик
for (int a = 0; a < indexRow.size(); a++) {
if (!booleanRow.get(a)) continue; // если текущее значение false - закрытие тега то продолжаем цикл
if ((booleanRow.get(a)) && (booleanRow.get(a + 1))) { // если текущее и следующее по очереди зачение true, то инкрементируем счётчик и продолжаем цикл
counter++;
continue;
}
if ((booleanRow.get(a)) && (!booleanRow.get(a + 1)) && (counter > 0)) { // если текущее значение true, следующее false и счётчик больше нуля, то выводим накопившиеся теги по порядку
while (counter > 0) {
System.out.println(buffer.substring(indexRow.get(a - counter), indexRow.get(a + 1 + counter) + 7));
counter--;
}
}
if ((booleanRow.get(a)) && (!booleanRow.get(a + 1)) && (counter == 0)) { // если текущее значение true, а следующее false счётчик нулевой - значит выводим тег
System.out.println(buffer.substring(indexRow.get(a), indexRow.get(a + 1) + 7));
}
}
}
}
Юрий Петров
27 уровень
Сделал без Jsoup через TreeMap. Код рабочий. Кто-то подскажет - что нужно валидатору? Возможно я что-то не так понял... Спасибо!
Архивный
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Александр Алексеев
10 мая 2020, 14:24
Запусти свой код с таким форматированием
+1
Юрий Петров
11 мая 2020, 13:13
Выводит вот это. Вроде норм.
0
Александр Алексеев
13 мая 2020, 07:21
Нет, не норм. В вывод попадают лишние пробелы или знаки табуляции
+1
Юрий Петров
14 мая 2020, 15:09
Это знаки табуляции. Никогда бы не подумал, что их не должно быть, если они есть в исходном файле. Попробую поработать над этим.
0
Юрий Петров
14 мая 2020, 15:52
Сделал чтобы в строку из StringBuffer не попадали знаки табуляции. Выводит следующее, но валидацию не проходит по тому же пункту.
0
Александр Алексеев
15 мая 2020, 13:23
У меня твой код выдал следующее:
+1
Александр Алексеев
15 мая 2020, 13:27
Попробуй при считывании файла сразу удалять знаки табуляции
+1
Юрий Петров
15 мая 2020, 13:42
Просто здесь в задаче ещё код старого образца. Ок, попробую.
0
Юрий Петров
15 мая 2020, 15:19
Опять фейл.
Кстати спасибо большое за помощь!)
0
Александр Алексеев
15 мая 2020, 15:54
Мне уж самому интересно. Замени на свежий код
+1
Юрий Петров
15 мая 2020, 17:28
Ну вот. Если чего мне уже не принципиально удовлетворить валидатор. Понимаю, что можно всё раза три переделать и он что-то да примет, но для меня главное что код работает и очевидных претензий у валика для него нет. Просто жаль времени.
0
Александр Алексеев
15 мая 2020, 18:45
31 строку убери. - выводит неформатированную строку.
Если у тега нет пары или тег написан с ошибкой, у тебя вылезает IndexOutOfBoundsException. Может в этом дело.
+1
Юрий Петров
15 мая 2020, 19:15
Строку 31 убрал - не помогло. В условиях задачи написано "для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нет", хотя можно рассмотреть и твой вариант. То, что пока догадался сделать - обернуть последний цикл, где выводятся теги в try/catch - не помогло. Может позже на ум придёт что-то получше и я ещё поэкспериментирую... Спасибо ещё раз! 👍
0