Замена чисел

  • 10
  • Недоступна
В статическом блоке инициализируйте словарь map парами [число-слово] от 0 до 12 включительно. Считайте с консоли имя и содержимое файла. Замените все числа на слова используя словарь map. После этого выведите результат на экран и закройте потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (156)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Lein35 уровень, Москва
18 июня, 14:05
s = s.replaceAll("\\b"+ m.getKey()+"\\b", m.getValue()); с третей попытки из-за кавычек не там(
Сергей23 уровень
15 июня, 12:14
Зачем тут регулярка - парсим слова - если число и нам подходит - подменяем значением из мапы.
Олеся26 уровень, Санкт-Петербург
6 июня, 15:59
Как-то даже неловко после ваших регулярных выражений показывать своё, но вдруг найдутся такие же как и я, кто еще пока плохо сочиняет регулярные выражения. Мне для решения задачи оказалось достаточно "\\d+".
Tanarri31 уровень
29 апреля, 07:18
чертова кириллица. каких только ужасов из за нее ни придумаешь: "(?:^|\\s)(\\d+)(?:\\s|$)" зато наконец то дошли руки разобраться с группами:)
Ильяс35 уровень, Москва
16 мая, 10:39
Не обязательно можно было не включать в группу. Достаточно было указывать порядковый номер 2 группы. И еще можно вызвать ошибку, если в тексте будет число например 19, ведь регулярка клюнет, а вот map.get вызовет ошибку.
Tanarri31 уровень
16 мая, 10:56
регулярка клюнет и на 110 в примере. но там дальше есть замечательное условие: map.containsKey
Ильяс35 уровень, Москва
16 мая, 12:56
Тогда двойная проверка получается. Можно сразу тогда: "((^|\\s)"+pair.getKey()+"(\\s|$))"
Tanarri31 уровень
17 мая, 11:38
но тогда мы будем 13 раз проходиться по тексту, независимо от того есть там цифры или нет. А так мы пройдемся 1 раз по тексту и проверим является ли найденное ключем. Впрочем, регулярку действительно можно было ограничить двузначным числом.
Ильяс35 уровень, Москва
17 мая, 11:53
В принципе contains так и так будет внутри себя тринадцать раз проверять есть ли ключ
Tanarri31 уровень
17 мая, 12:18
само собой. Но вдруг там файл с замечательной книгой "Война и Мир"? 13 раз прочитать Войну и Мир?
Ильяс35 уровень, Москва
17 мая, 13:28
Причём тут файл, код читает только ключи.
24 мая, 09:44
а каким боком в этой регулярке кириллица? я чего то не понимаю....
Tanarri31 уровень
24 мая, 10:02
потому что без нее хватило бы \b\d+\b
24 мая, 11:30
поясни.. сначала идет незапоминающая группа которая проверяет начало ли это слова или пробел потом группа запоминаемая с цифрами и после этого незапоминаемая.. я не могу понять при чем здесь кириллица? (\\b\\d+\\b) - захват гшруппы.. просто я еще слабо ориентируюсь в regex хотелось бы не наступать на грабли именно с кириллицей
Tanarri31 уровень
24 мая, 13:46
https://regex101.com/ и попробуй применить регулярку \\b\\d+\\b к строке "12файл1". В теории \b означает границу слова, а значит в "12file1" matcher не найдет ни одного совпадения. Зато в "12файл1" их будет аж 2, а значит нам надо как то по другому искать отдельно стоящие цифры. Соответственно нам нужно число стоящее в начале строки с одной стороны и пробелом(ну или табуляцией) с другой стороны, либо отделенное пробелами с обоих сторон, либо пробел слева и конец строки справа. почему вот так (?:^|\\s), а не так (^|\\s): первая запись в итоге даст 2 группы, вторая запись 4 группы. мне для решения этой задачи 2х групп хватит. почему \d+ вместо \d{1,2} - чисто мои тараканы. вдруг я в map добавлю 110 : "сто десять"? почему ((^|\\s)"+pair.getKey()+"(\\s|$)) мне менее симпатична, чем (?:^|\\s)(\\d+)(?:\\s|$) и map.containsKey? - тоже чисто мои тараканы: например текст из 10 000 строк содержащий всего 1 отдельную цифру 12. Другое дело, что Ильяс будет прав, если в тексте почти все окажется цифрами.
Alexey Tarakanov35 уровень, Москва
22 марта, 00:13
Надо 13 значений, 0 забыл, я очень внимателен :( Минус попытка ОдинНадцать, я грамотей :( Ещё минус попытка
27 марта, 16:36
Тоже одинадцать написал и еще думал, что он от меня хочет :) причем тут 11 , если надо 13 значений заносить
Максим28 уровень, Минск
20 апреля, 20:19
Аналогично)) -2 попытки из-за ошибок в статическом блоке )
vapima20 уровень, Москва
пятница, 12:13
-2 попытки, не умею писать цифры буквами, позор ((
Александр23 уровень, Казань
21 марта, 12:54
Не пропустило мою крутую регулярку, которая даже русские символы учитывало. Если в примере пробел убрать у точки - то текущая регулярка которая принимается - сдуется.
Pattern.compile("[^А-Яа-яеЁ]\\b(\\d[0-2]?)\\b[^А-Яа-яеЁ]");
Николай25 уровень
19 марта, 13:40
Да блин, сколько же нас неграмотных то? одинНадцать ))))
TheDIP23 уровень, Киев
9 марта, 23:26
Долго сидел, но решил без регулярок. Если кому-то будет полезно: 1) Сплитим строку 2) Законяем в ArrayList<String> 3) делаем foreach нашей Мапы - в цикле проверяем, содержится ли каждый элемент Мапы в нашем ArrayList<String> - если содержится то берем ключ и значение - проходимся по всему ArrayList и если значение == ключу (а оно будет, так как мы узнали что оно содержится уже там) делаем arrayList.set(); 4) выводим обновленный ArrayList<String> с двумя проверками
for (int i = 0; i < arrayList.size(); i++){
                System.out.print(arrayList.get(i) + " ");
                if (arrayList.get(i).equals(".") || arrayList.get(i).endsWith(".")){
                    System.out.println();
                }
            }
5) Ну и я потом его очищал, и новую строку парсил в пустой. Всем удачи :)
Николай25 уровень
19 марта, 13:46
а как ваш код отработает, если внутри строки будет подряд несколько пробелов? А если будет набор всяких символов? Вы же сначала не соберете такую же строку (не хватит пробелов) а потом будете по каждой точке писать новую строку? Тут скорее недоработка в тестовом наборе данных для проверки решения.
Riccio30 уровень, Москва
10 мая, 19:25
Знаете, Николай, а вдруг вместо строки нам пришлют атомную бомбу? А вдруг ничего не пришлют? А вдруг пришлют, но не строку, а стриптизёршу в торте? Есть ТЗ. Была бы реальная ситуация - отправил бы ТЗ на доработку. Или сделал как написано + как я считаю правильным. Если получается просадка по срокам - косяк того, кто писал ТЗ. Делать многоуровневую "защиту от дурака" в тестовом упражнении - а смысл? Валидатор принял и этого достаточно. А если вы хотите стать в позицию заказчика - платите деньги. И тогда любой каприз. "Без внятного ТЗ - результат ХЗ" :))
Максим28 уровень
12 февраля, 16:59
одиННадцать
Nik24 уровень
13 февраля, 22:20
xDDDD тоже попался
Alexey Polyakov29 уровень
8 января, 20:26
2 попытки потратил на поиск опечаток в статическом блоке))))
Даниил32 уровень
30 января, 00:22
Я только одну))) Так что не ты один слова не знаешь)