package com.javarush.task.task19.task1924;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Замена чисел
*/
public class Solution {
public static Map<Integer, String> map = new HashMap<Integer, String>();
static {
map.put(0, "ноль");
map.put(1, "один");
map.put(2, "два");
map.put(3, "три");
map.put(4, "четыре");
map.put(5, "пять");
map.put(6, "шесть");
map.put(7, "семь");
map.put(8, "восемь");
map.put(9, "девять");
map.put(10, "десять");
map.put(11, "одиннадцать");
map.put(12, "двенадцать");
}
public static void main(String[] args) throws IOException {
// BufferedReader readerName = new BufferedReader(new InputStreamReader(System.in));
// String filename = readerName.readLine();
FileReader fileReader = new FileReader("test.txt");
BufferedReader reader = new BufferedReader(fileReader);
while (reader.ready()) {
String line = reader.readLine(); //чтение строки
Pattern pattern = Pattern.compile("\\b\\d\\b");
Matcher matcher = pattern.matcher(line); //поиск regex в строке
for (Map.Entry<Integer, String> entry : Solution.map.entrySet()) { //прогон по словарю
if (matcher.find() && (Integer.parseInt(matcher.group()) == entry.getKey())) { //если находит и в то же время найденное равно ключу из словаря
line = line.replaceAll(matcher.group(), entry.getValue()); //то заменяется то, что найдено на значение из map
}
}
System.out.println(line);
}
}
}
Anastasiia
20 уровень
Подскажите, пожалуйста, почему так не работает?
Архивный
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
AnastasiiaExpert
14 февраля 2019, 20:45
я поместила hash map в main со всем его хозяйством)), теперь в for заходит, выводит это
System.out.println(matcher.find()+" "+matcher.group()); - true 1
а) почему не заходило, когда map static в Solution
б) почему останавливается на 1й цифре и не заменяет
0
IceBergMaster
14 февраля 2019, 22:16решение
1) такая регулярка находит только значения в одну цифру (0-9).
2) метод matcher.find() пошаговый, при первом вызове он пытается найти первое совпадение, при повторном вызове он стартует с места первого совпадения и продолжает поиск дальше.
3) бегать по мапе и параллельно вызывать matcher.find() не прокатит. Вот берете вы первое значение из мапы "0", а matcher.find() находит "1", соответственно условие не выполняется, дальше вы берете из мапы "1", а matcher.find() вам находит уже следующее, совсем другое число (в примере задания больше ничего найдено не будет, так как 12 не попадает в регулярку), т.е. вероятность замены с таким решением крайне мала, а должна быть 100%.
4) "а) почему не заходило, когда map static в Solution" - так map и так static в Solution, или я не понял ваш вопрос? Объявляем маму как переменную класса (static), а инициируем в блоке static, этот блок можно рассматривать как конструктор класса (не объекта).
+1
AnastasiiaExpert
15 февраля 2019, 02:33решение
Спасибо за подробный ответ, в итоге разобралась так
Долго мучалась с тем, что единица заменялась в цифре 12.
1. Читаю строку
2. открываю луп для map
3. Объявляю паттерн и метчер с "\\d+"
4. while метчер находит -> если найденное равно ключу, то replaceAll
самая загвоздка в итоге была здесь с границами ("\\b"+ num +"\\b", entry.getValue())
что касается map, то не заходило, потому что потеряла слово static перед {, выше его добавила.
+2
IceBergMaster
15 февраля 2019, 09:32
Если подобрать регулярку, которая находит только числа диапазона 0-12, то пробег по мапе можно и не делать, а просто вызывать значение по ключу group(). Но это всё уже мелочи)
0
AnastasiiaExpert
15 февраля 2019, 23:29
или так
if (map.containsKey(num)) {
line = line.substring(0, matcher.start(1)) + map.get(num) + line.substring(matcher.end(1));
matcher.reset(line);
0