Вопрос скорее даже не по самой задаче, а по алгоритму считывания строки(замены одного значения на другое). Например, почему при таком варианте считывания, результат вывода такой (не происходит замены первого встреченного элемента(слова), но второе заменяется): Это стоит 1 бакс, а вот это - двенадцать В оригинальном решении сразу присваивается результат той же строке (без моей промежуточной result) и результат вывода сразу правильный templine = tempLine.replaceAll("\\b" + mapa.getKey() + "\\b", mapa.getValue()); import java.io.*; import java.util.*; public class Split3 { public static Map<Integer, String> map = new HashMap<>(); 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 { String filename; String tempLine = null; String result = null; try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { filename = br.readLine(); } try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { while ( (tempLine = reader.readLine()) != null ) { for (Map.Entry<Integer,String> mapa : map.entrySet()) { result = tempLine.replaceAll("\\b" + mapa.getKey() + "\\b", mapa.getValue()); // ПРОМЕЖУТОЧНАЯ СТРОКА result } System.out.println(result); } } } }