JavaRush
AI Academy
new
Акция
Университет
Java FullStack
Python FullStack
AI Native Developer
new
Web FullStack
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/ПОДСКАЖИТЕ ПЛИЗ , ГДЕ ОШИБКА?
Антон Никифоров
29 уровень
  • 22.02.2023
  • 578просмотров
  • 25комментариев

ПОДСКАЖИТЕ ПЛИЗ , ГДЕ ОШИБКА?

Вопрос по задаче Замена чисел
Java Core,  9 уровень,  11 лекция
Обсуждается


1. В статическом блоке инициализировать словарь map парами [число-слово] от 0 до 12 включительно.
Например, 0 - "ноль", 1 - "один", 2 - "два"
2. Считать с консоли имя файла, считать содержимое файла.
3. Заменить все числа на слова используя словарь map.
4. Результат вывести на экран.
5. Закрыть потоки.

Пример данных в файле:
Это стоит 1 бакс, а вот это - 12.
Переменная имеет имя file1.
110 - это число.

Пример вывода в консоль:
Это стоит один бакс, а вот это - двенадцать.
Переменная имеет имя file1.
110 - это число.

Требования:
  • Класс Solution должен содержать публичное статическое поле map типа Map<Integer, String>, которое должно быть сразу проинициализировано.
  • Программа должна считывать имя файла с консоли (используй BufferedReader).
  • BufferedReader для считывания данных с консоли должен быть закрыт.
  • Программа должна считывать содержимое файла (используй FileReader).
  • Поток чтения из файла (FileReader) должен быть закрыт.
  • Программа должна выводить в консоль все строки из файла, но числа должны быть заменены на слова из словаря map.
  • Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар.
....
package com.javarush.task.task19.task1924; 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.Map; 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 boolean isNumeric(String str) { try { Integer.parseInt(str); return true; } catch(NumberFormatException e){ return false; } } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); reader.close(); BufferedReader reader1 = new BufferedReader(new FileReader("C:\\Users\\user\\Desktop\\20.txt")); String s=""; //этот файл не пустой while (reader1.ready()){ String p= reader1.readLine(); s+=p; } ArrayList <String>list = new ArrayList<>(); ///System.out.println(s); String s1 [] = s.split(" "); for (String sk: s1) { if (isNumeric(sk)) { Integer a=Integer.parseInt(sk); for(Map.Entry<Integer,String> m: map.entrySet()){ int key= m.getKey(); String value = m.getValue(); if(a.equals(key)){list.add(value);} } } else { list.add(sk); } }System.out.println(list); } }
0
Комментарии (25)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Антон Никифоров
Уровень 29
27 февраля 2023, 14:37
НУ ГДЕ ОШИБКА ??? ВСЕ РАБОТАЕТ?? не проходят два последних условия Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар. "В статическом блоке класса Solution должна добавляться пара значений 7 - "семь" в карту map." Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар.
0
hidden #598481
Уровень 27
27 февраля 2023, 14:52
Код покажешь?
0
Антон Никифоров
Уровень 29
2 марта 2023, 06:51
Братуха, мне уже не удобно к тебе обращаться🤔!!! Два дня на работе был, не занимался! вот вывод C:\Users\user\Desktop\20.txt Это стоит один бакс, а вот это - двенадцать. Переменная имеет имя file1. 110 - это число. вот код 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 boolean isNumeric(String str) { try { Integer.parseInt(str); return true; } catch(NumberFormatException e){ return false; } } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); reader.close(); BufferedReader reader1 = new BufferedReader(new FileReader(name)); String s=""; //этот файл не пустой while (reader1.ready()){ String p= reader1.readLine(); s=s+p+"\n"; }reader1.close(); StringBuilder sb= new StringBuilder(); String S=""; String[] s1 = s.split("\\b"); for (String sk : s1) { if (isNumeric(sk)) { Integer a = Integer.parseInt(sk); if (map.get(a) != null) { S += map.get(a); } if (map.get(a) == null){S+=sk;continue;} else continue; } S+=sk; } System.out.println(S); } }
0
hidden #598481
Уровень 27
2 марта 2023, 08:14
Код по-прежнему немного корявый, но по большому счёту рабочий. Единственная проблема, которую я нашёл, это то, что ты в конце после текста добавляешь лишнюю пустую строку. У тебя файл заканчивается текстом, а ты при считывании в конце добавишь ещё один \n, которого там не было.
String content = fileReader.lines().collect(Collectors.joining(System.lineSeparator()));
Вот код, который считает все строки из файла в одну, разделяя их через перенос строки. fileReader здесь - это объект класса BufferedReader, в твоём случае это reader1.
0
Антон Никифоров
Уровень 29
2 марта 2023, 18:42
Спасибо ОГРОМНОЕ 👍 !!!! Сорян что отвлекал.
0
Антон Никифоров
Уровень 29
2 марта 2023, 19:57
короче так и не понял почему не проходило условие (даже с твоим кодом), выдавало эту ошибку "Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар. "В статическом блоке класса Solution должна добавляться пара значений 7 - "семь" в карту map." Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар." короче обнулил код и снова забил, и "Эврика"все сработало!!! сработало в и тоге с таким кодом: public static boolean isNumeric(String str) { try { Integer.parseInt(str); return true; } catch (NumberFormatException e) { return false; } } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); reader.close(); BufferedReader reader1 = new BufferedReader(new FileReader(name)); String s=""; while (reader1.ready()) { String p= reader1.readLine(); s=s+p+"\n"; } String S=""; reader1.close(); String[] s1 = s.split("\\b"); for (String sk : s1) { if (isNumeric(sk)) { Integer a = Integer.parseInt(sk); if (map.get(a) != null) { S += map.get(a); } if (map.get(a) == null){S+=sk;continue;} else continue; } S+=sk; } System.out.println(S); } }
0
Антон Никифоров
Уровень 29
2 марта 2023, 20:03
СПАСИБО ЗА ПОМОЩЬ!!!
0
Антон Никифоров
Уровень 29
27 февраля 2023, 14:35
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 boolean isNumeric(String str) { try { Integer.parseInt(str); return true; } catch(NumberFormatException e){ return false; } } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); reader.close(); BufferedReader reader1 = new BufferedReader(new FileReader(name)); String s=""; //этот файл не пустой while (reader1.ready()){ String p= reader1.readLine(); s=s+p+"\n"; }reader1.close(); StringBuilder sb= new StringBuilder(); String S=""; String[] s1 = s.split("\\b"); for (String sk : s1) { if (isNumeric(sk)) { Integer a = Integer.parseInt(sk); if (map.get(a) != null) { S += map.get(a); } if (map.get(a) == null){S+=sk;continue;} else continue; } S+=sk; } System.out.println(S); } }
0
hidden #598481
Уровень 27
23 февраля 2023, 10:22
1) имя файла не считываешь, а захардкодил. 2) склеиваешь все строки в одну без разделителя:
abc 1
2 def
 ↓ 
abc 12 def
 ↓ 
abc двенадцать def
. Помимо ошибок с парсингом чисел, само по себе отсутствие переносов строк в итоговом тексте - это уже неправильно. 3) теряешь все пробелы в конце текста при их наличии. 4) не заменяешь числа, после которых идёт знак препинания. 5) выводишь не текст, а строковое представление списка. Любой из этих ошибок уже достаточно, чтобы тест был не пройден. Ну и в целом замечания: использование списка - плохая затея. Для работы со строками лучше использовать StringBuilder. Подсказка про регулярные выражения - тоже стоящая. И напоследок:
for(Map.Entry<Integer,String> m: map.entrySet()){
    int key= m.getKey();
    String value = m.getValue();
    if(a.equals(key)){list.add(value);}
}
Чтобы получить значение из мапы, не нужно её всю перебирать циклом. Есть метод get, есть ключ - просто получи значение из мапы.
0
Антон Никифоров
Уровень 29
26 февраля 2023, 09:23
спасибо большое за разбор моих ошибок !!! сейчас буду исправлять
0
Антон Никифоров
Уровень 29
27 февраля 2023, 07:02


0
Антон Никифоров
Уровень 29
27 февраля 2023, 07:04
Это стоит 0один23456789101112 бакс, а вот это - 01234567891011двенадцать. Переменная имеет имя file1. 0123456789101112 - это число. все вроде работает но немогу понять откуда эти непонятные цифры , КУДА КОПАТЬ?
0
Антон Никифоров
Уровень 29
27 февраля 2023, 07:06
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 boolean isNumeric(String str) { try { Integer.parseInt(str); return true; } catch(NumberFormatException e){ return false; } } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); reader.close(); BufferedReader reader1 = new BufferedReader(new FileReader(name)); String s=""; //этот файл не пустой while (reader1.ready()){ String p= reader1.readLine(); s=s+p+"\n"; }reader1.close(); //System.out.println(s); StringBuilder sb= new StringBuilder(); String S=""; //System.out.println(); String[] s1 = s.split("\\b"); for (String sk: s1) { if (isNumeric(sk)) { Integer a=Integer.parseInt(sk); for(Map.Entry<Integer,String> m: map.entrySet()){ int key= m.getKey(); String value = m.getValue(); if(a.equals(key)){S+=value;} else if(!a.equals(key)){S+=key;} else continue; } } else { S+=sk; } }System.out.println(S); } }
0
hidden #598481
Уровень 27
27 февраля 2023, 07:48
Ты по-прежнему перебираешь всю мапу, чтобы получить из неё одно значение по ключу. Вместо всего цикла for, перебирающего мапу, нужен один вызов map.get, и я тебе уже писал об этом в первом комментарии. И потом, ты уже на 20 уровне, попробуй подебажить сам. Этот навык не просто полезный, а необходимый для каждого разработчика. Шаг за шагом выполняй свою программу, и ты увидишь, откуда берутся дети цифры.
0
Антон Никифоров
Уровень 29
27 февраля 2023, 07:59
спасибо
0
Антон Никифоров
Уровень 29
27 февраля 2023, 12:12
Извини я наверное тебя замучил!!! Но сейчас все работает как часы, учел все твои замечания, прошелся дебагом но валидатор не принимает🤢😪 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 boolean isNumeric(String str) { try { Integer.parseInt(str); return true; } catch(NumberFormatException e){ return false; } } public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String name = reader.readLine(); reader.close(); BufferedReader reader1 = new BufferedReader(new FileReader(name)); String s=""; //этот файл не пустой while (reader1.ready()){ String p= reader1.readLine(); s=s+p+"\n"; }reader1.close(); StringBuilder sb= new StringBuilder(); String S=""; String[] s1 = s.split("\\b"); for (String sk : s1) { if (isNumeric(sk)) { Integer a = Integer.parseInt(sk); if(a.equals(map.get(a))){S+=map.get(a);} }S+=sk;continue; } System.out.println(S); } }
0
Антон Никифоров
Уровень 29
27 февраля 2023, 12:14
не проходят два последних условия Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар. "В статическом блоке класса Solution должна добавляться пара значений 7 - "семь" в карту map." Класс Solution должен содержать статический блок, в котором добавляются в map тринадцать пар.
0
hidden #598481
Уровень 27
27 февраля 2023, 12:56
Посмотри внимательно, что и с чем ты сравниваешь. Все проблемы по-прежнему здесь
for (String sk : s1) {
    if (isNumeric(sk)) {
        Integer a = Integer.parseInt(sk);
        if(a.equals(map.get(a))) {
            S+=map.get(a);
        }
    }
    S+=sk;
    continue;
}
Начну с конца. Какой смысл в continue в конце цикла? У тебя цикл так и так перейдёт на следующую итерацию, континью не делает ничего. Кажется, стоит отдохнуть 😉 Кстати, заметь, я отформатировал твой код, чтобы его было проще читать. Стоит это делать самому и почаще, чтобы не путаться в мелочах. Ну а теперь по существую. Что у тебя хранится в мапе: числа и соответствующие числам строки. Что делает метод get? Получает по ключу соответствующее значение, то есть по числу получает соответствующую строку. При каких условиях полученное значение может совпадать с "a"? Да ни при каких, они даже разного класса. Как объект Integer может быть равен String? Никак. Кажется, ты не понимаешь метод get. Он берёт твой ключ a и получает по нему значение, которое соответствует этому ключу. Если ключ равен 5, то метод get вернёт тебе строку "пять". От тебя не требуется проверять, "пять" это или "шесть", потому что соответствие задано самой мапой: в мапе уже написано, что числу 5 соответствует строка "пять". Ок, а что будет, если написать map.get(50)? Метод вернёт null, потому что такого ключа нет в мапе. Так какая на самом деле нужна проверка перед тем, как делать замену? Ещё два момента:
String S="";
называть переменные с большой буквы - это очень плохо.
s=s+p+"\n";
Откуда ты знаешь, какой в файле будет разделитель строк? Это зависит от операционной системы. Либо прочитай все байты из файла разом, либо используй System.lineSeparator()
0
Антон Никифоров
Уровень 29
27 февраля 2023, 13:13
спасибо большое 👍, буду думать дальше!!!
0
Антон Никифоров
Уровень 29
27 февраля 2023, 13:15
просто, странно я запускаю код и он работает!?😵
0
hidden #598481
Уровень 27
27 февраля 2023, 13:32
Я не знаю, что ты запускаешь, но тот код, который ты тут написал, работать не может. Он вообще ни одного числа не заменит.
0
Антон Никифоров
Уровень 29
27 февраля 2023, 14:00
точно нашел ошибку
0
Гофф
Уровень 3
Master
23 февраля 2023, 05:47
Отчётливо видно, что такой полезнейший инструмент, как регулярные выражения, не знаком, да? Рекомендую, задача решается в пару строк.
0
Михаил
Уровень 41
22 февраля 2023, 20:21
41я строка. Я сначала не понял почему у меня ошибка выпадает. Ты уверен что валидатор сможет запустить этот код? Программа должна считывать имя файла с консоли (используй BufferedReader). Ну вот я ввел свой файл и что мне выдало? C:\\Users\\Professional\\Documents\\text.txt [Это, стоит, один, бакс,, а, вот, это, -, 12.Переменная, имеет, имя, file1.110, -, это, число.]
+1
Антон Никифоров
Уровень 29
26 февраля 2023, 09:32
спасибо, это я тестил и забыл заменить😀
0
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush