Получилось не очень красиво, но вывод корректный для разных примеров.
Не могу найти ошибку.
package com.javarush.task.task19.task1918;
/*
Знакомство с тегами
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
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 Exception{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String filePath = reader.readLine();
reader.close();
BufferedReader fileReader = new BufferedReader(new FileReader(filePath));
StringBuilder stringBuilder = new StringBuilder("");
while (fileReader.ready()) {
stringBuilder.append(fileReader.readLine()); // если несколько строк, то создаём одну
}
fileReader.close();
String for_open = "<" + args[0]; //паттерн для открытия тега
String for_close = "</" + args[0] + ">"; //паттерн для закрытия тега
Pattern p_open = Pattern.compile(for_open);
Pattern p_close = Pattern.compile(for_close);
String tmp = stringBuilder.toString(); // наша итоговая строка
Matcher m_open = p_open.matcher(tmp);
Matcher m_close = p_close.matcher(tmp);
TreeMap<Integer,String> treeMap = new TreeMap<Integer, String>(); // упорядочить очередь появления тегов
while (m_open.find()) {
treeMap.put(m_open.start(),"open"); // загоняем все открытые теги
}
while (m_close.find()) {
treeMap.put(m_close.end()-1,"close"); // загоняем все закрытые теги
}
ArrayList<Integer> str_from = new ArrayList(); // список для substr_from
ArrayList<Integer> str_to = new ArrayList(); // список для substr_to
int i = 0; // вспомогательная переменная
for (Map.Entry<Integer,String> pair : treeMap.entrySet()) {
if (pair.getValue().equals("open")) {
str_from.add(pair.getKey()); // список позиций открытых тегов
i = 0; // флаг для последнего открытого тега
}
if (pair.getValue().equals("close")) {
if (i == 0) { // закрываем последний открытый тег
str_to.add(pair.getKey());
i++;}
else { // если закрываем 2 раза подряд - значит и более ранние теги закрываются
str_to.add(0,pair.getKey());} // ставим более ранние теги в начало
}
}
for (int j = 0; j < str_from.size(); j++) {
System.out.println(tmp.substring(str_from.get(j), str_to.get(j)+1)); //вывод
}
}
}
package com.javarush.task.task19.task1918;
/*
Знакомство с тегами
*/
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
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 Exception{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String filePath = reader.readLine();
reader.close();
BufferedReader fileReader = new BufferedReader(new FileReader(filePath));
StringBuilder stringBuilder = new StringBuilder("");
while (fileReader.ready()) {
stringBuilder.append(fileReader.readLine());
}
fileReader.close();
String for_open = "<" + args[0];
String for_close = "</" + args[0] + ">";
Pattern p_open = Pattern.compile(for_open);
Pattern p_close = Pattern.compile(for_close);
String tmp = stringBuilder.toString();
Matcher m_open = p_open.matcher(tmp);
Matcher m_close = p_close.matcher(tmp);
TreeMap<Integer,String> treeMap = new TreeMap<Integer, String>();
while (m_open.find()) {
treeMap.put(m_open.start(),"open");
}
while (m_close.find()) {
treeMap.put(m_close.end()-1,"close");
}
ArrayList<Integer> str_from = new ArrayList();
ArrayList<Integer> str_to = new ArrayList();
int i = 0;
for (Map.Entry<Integer,String> pair : treeMap.entrySet()) {
if (pair.getValue().equals("open")) {
//i++;
str_from.add(pair.getKey());
i = 0;
}
if (pair.getValue().equals("close")) {
if (i == 0) {
str_to.add(pair.getKey());
i++;}
else {
str_to.add(0,pair.getKey());}
}
}
for (int j = 0; j < str_from.size(); j++) {
System.out.println(tmp.substring(str_from.get(j), str_to.get(j)+1));
}
}
}