-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
118 lines (95 loc) · 4.54 KB
/
Solution.java
File metadata and controls
118 lines (95 loc) · 4.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//When he had said this, one of the officers standing by slapped Jesus with his hand, saying, "Do you answer the high priest like that?" (John 18:22)
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.*;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader conReader = new BufferedReader(new InputStreamReader(System.in));
String fileName = conReader.readLine();
conReader.close();
//Read File
BufferedReader fileBufReader = new BufferedReader(new FileReader(fileName));
StringBuffer content = new StringBuffer();
while (fileBufReader.ready())
content.append(fileBufReader.readLine());
fileBufReader.close();
StringBuffer text = new StringBuffer(content.toString().replaceAll("\r\n", ""));
String tagOpen = "<" + args[0];
String tagClose = "</" + args[0] + ">";
int pozitionOpen = -1;
int pozitionClose = -1;
int shift = -1;
Stack<Integer> openedTags = new Stack<>();
Map<Integer, Integer> tags = new TreeMap<>(new MyComparator());
while (true) {
pozitionOpen = text.indexOf(tagOpen, shift);
pozitionClose = text.indexOf(tagClose, shift);
if (pozitionOpen < 0 && pozitionClose < 0)
break;
if (pozitionOpen != -1 && pozitionOpen < pozitionClose) { //Open ближе чем close
openedTags.push(pozitionOpen);
shift = pozitionOpen + tagOpen.length();
continue;
}
if (pozitionClose != -1 && (pozitionOpen > pozitionClose || pozitionOpen == -1)) { //Close ближе чем open
if (openedTags.isEmpty())
break;
tags.put(openedTags.pop(), pozitionClose + tagClose.length());
shift = pozitionClose + tagClose.length();
}
}
for (Map.Entry<Integer, Integer> pair : tags.entrySet()) {
System.out.println(text.substring(pair.getKey(), pair.getValue()));
}
}
static class MyComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
}
}
/*
Знакомство с тегами
Считайте с консоли имя файла, который имеет HTML-формат.
Пример:
Info about Leela <span xml:lang=»en» lang=»en»><b><span>Turanga Leela
</span></b></span><span>Super</span><span>girl</span>
Первым параметром в метод main приходит тег. Например, «span«.
Вывести на консоль все теги, которые соответствуют заданному тегу.
Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле.
Количество пробелов, n, r не влияют на результат.
Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нет.
Тег может содержать вложенные теги.
Пример вывода:
<span xml:lang="en" lang="en"><b><span>Turanga Leela</span></b></span>
<span>Turanga Leela</span>
<span>Super</span>
<span>girl</span>
Шаблон тега:
<tag>text1</tag>
<tag text2>text1</tag>
<tag
text2>text1</tag>
text1, text2 могут быть пустыми
Требования:
1. Программа должна считывать имя файла с консоли (используй BufferedReader).
2. BufferedReader для считывания данных с консоли должен быть закрыт.
3. Программа должна считывать содержимое файла (используй FileReader).
4. Поток чтения из файла (FileReader) должен быть закрыт.
5. Программа должна выводить в консоль все теги, которые соответствуют тегу, заданному в параметре метода main.
package com.javarush.task.task19.task1918;
*
Знакомство с тегами
*
public class Solution {
public static void main(String[] args) {
}
}
*/