Добрый день.
Подумал что правильнее будет решать рекурсией, результат соответствует примеру из условия.
Пожалуйста, подскажите, чего не хватает валидатору? Не проходит последний пункт.
Можно ли получить пример файла, на котором проверяется решение?
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.Iterator;
/*
Знакомство с тегами
*/
public class Solution {
public static void main(String[] args) throws IOException {
if (args.length == 0) return;
// Имя тега
String tag = args[0];
String startTag = "<"+tag;
String endTag = "</"+tag+">";
// Имя файла
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
reader.close();
// Прочитать файл
reader = new BufferedReader(new FileReader(fileName));
StringBuilder content = new StringBuilder();
while (reader.ready()) {
content.append(reader.readLine().replaceAll(System.lineSeparator(), ""));
}
reader.close();
// Распечатать теги
printOccurrences(content, startTag, endTag);
}
private static void printOccurrences (StringBuilder content, String startTag, String endTag) {
// Индекс первого вхождения закрывающего тега для полученного контента
int endTagFirstOccurrence = getFirstOccurrence(content, endTag, true);
if (endTagFirstOccurrence == -1) return;
// Закрывающие теги
ArrayList<Integer> endTags = new ArrayList<>();
endTags.add(endTagFirstOccurrence);
// Все индексы вхождений открывающих тегов до первого закрывающего тега
ArrayList<Integer> startTags = getOccurrences(new StringBuilder(content.substring(0, endTagFirstOccurrence)), startTag, false);
// Дополняем закрывающими тегами
for (int i = 1; i < startTags.size(); i++) {
endTags.add(0, endTagFirstOccurrence + getFirstOccurrence(new StringBuilder(content.substring(endTagFirstOccurrence)), endTag, true));
}
// Печатаем
for (int i = 0; i < startTags.size(); i++) {
System.out.println(content.substring(startTags.get(i), endTags.get(i)));
}
// Рекурсия
printOccurrences(new StringBuilder(content.substring(endTags.get(0))), startTag, endTag);
}
private static int getFirstOccurrence(StringBuilder content, String toFind, boolean includeToFindLen){
ArrayList<Integer> res = getOccurrences(content, toFind, includeToFindLen);
return res.size() == 0 ? -1 : res.get(0);
}
private static ArrayList<Integer> getOccurrences(StringBuilder content, String toFind, boolean includeToFindLen){
ArrayList<Integer> result = new ArrayList<>();
int index;
int overAll = 0;
while ((index = content.substring(overAll).indexOf(toFind)) != -1){
if (includeToFindLen)
result.add(overAll + index + toFind.length());
else
result.add(overAll + index);
overAll += index + toFind.length();
}
return result;
}
}