проверяла все тестовые примеры, и те, что в других обсуждениях. Все работает отлично. Но валидатор не согласен...
Тест-пример:
1_начало, конец_1
2_начало3_начало4_начало5_начало, конец_5, конец_4, конец_3
, конец_2
6_начало7_начало8_начало, конец_8, конец_79_начало, конец_9, конец_6
Вывод:
1_начало, конец_1
2_начало3_начало4_начало5_начало, конец_5, конец_4, конец_3, конец_2
3_начало4_начало5_начало, конец_5, конец_4, конец_3
4_начало5_начало, конец_5, конец_4
5_начало, конец_5
6_начало7_начало8_начало, конец_8, конец_79_начало, конец_9, конец_6
7_начало8_начало, конец_8, конец_7
8_начало, конец_8
9_начало, конец_9
Вроде все ок. Или нет?
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.HashMap;
import java.util.List;
import java.util.Map;
/*
Знакомство с тегами
*/
public class Solution {
static class Pair {
int left;
int right;
Pair(int left) {
this.left = left;
}
}
static List<Pair> pairList = new ArrayList<>();
public static void main(String[] args) throws IOException {
String fileName = "";//C:\test\task1918.txt
String in = "<" + args[0];
String out = "</" + args[0] + ">";
String line = "";
try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
fileName = reader.readLine();
}
try (BufferedReader fileReader = new BufferedReader(new FileReader(fileName))){
while (fileReader.ready()){
String str = fileReader.readLine();
line += (str.equals(in)) ? str + " " : str;
}
}
int openTegIndx = 0;
while (openTegIndx != -1) {
openTegIndx = line.indexOf(in, openTegIndx);
if (openTegIndx == -1) {
break;
}
pairList.add(new Pair(openTegIndx));
openTegIndx++;
}
List<Pair> tmp = new ArrayList<>(pairList);
Map<Integer, Integer> map = new HashMap<>();
int closeTegIndx = 0;
int deltaMin;
int count = 0;
while (closeTegIndx != -1) {
closeTegIndx = line.indexOf(out, closeTegIndx);
if (closeTegIndx == -1) {
break;
}
while (!tmp.isEmpty()) {
deltaMin = closeTegIndx - tmp.get(count).left;
if (deltaMin < 0) {
count--;
break;
} else {
count++;
if (count == tmp.size()){
count--;
break;
}
}
}
map.put(tmp.get(count).left, closeTegIndx);
tmp.remove(count);
closeTegIndx++;
count = 0;
}
for (Pair p : pairList) {
p.right = map.get(p.left);
}
for (Pair pair : pairList) {
System.out.println(line.substring(pair.left, pair.right + out.length()));
}
}
}