Выводим только цифры

  • 6
  • Недоступна
В методе main подмени объект System.out написанной тобой ридер-оберткой по аналогии с лекцией. Твоя ридер-обертка должна выводить только цифры. Вызови готовый метод printSomething(), воспользуйтесь testString. Верни переменной System.out первоначальный поток. Выведи модифицированную строку в консоль
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (77)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Shaggy
Уровень 38, Санкт-Петербург, Россия
28 июня, 09:26
Для тех кто не понял решения "\\D" - это любой символ не являющийся цифрой. Если же написать с маленькой буквы "//d" это будет любой символ являющийся цифрой. Подробней можно найти тут https://docs.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html
Денис Измайлов Инженер- программист в CloudFactory
23 сентября, 07:55
интересно, почему оно не работает с "^[0-9]" ...
Анатолий Лебедь
Уровень 19, Szczecin, Польша
10 апреля, 08:00
"\\D"
DenisKa
Уровень 23, Екатеринбург, Россия
11 марта, 11:53
"\\p{Digit}"
Даниил Александрович
Уровень 35, Тамбов , Россия
8 февраля, 17:55
[^0-9]
Влад
Уровень 26
3 февраля, 12:06
в чем разница методов replace и replaceAll ?
Angelina Ageeva
Уровень 23, Симферополь, Россия
6 февраля, 15:38
replace заменяет один char на другой char replaceAll работает со строками (внутри них может быть сколько угодно символов)
Иван
Уровень 36, Рязань, Россия
15 ноября 2020, 14:54
Может кому то пригодиться, создаем список длиной строки из метода printSomething(), затем заполняем список символами list.add(result.substring(i, i + 1)); ну и дальше парсим элементы списка, если число то добавляем в StringBuilder
Pavel
Уровень 35, Россия
26 ноября 2020, 07:45
есть вариант по проще, просто вызвать метод replaceAll() и передать туда параметр "\\D+" и "".
Igor Zaharov
Уровень 20, Кишинёв, Молдова
21 сентября 2020, 12:15
прикольная задачка
MR
Уровень 22, Харьков, Украина
10 сентября 2020, 11:57
Что-то я не поняла, в задаче надо вывести строку из цифр, а все тут пишут регулярки на то, чтобы их не выводить??
MR
Уровень 22, Харьков, Украина
10 сентября 2020, 12:04
ой, не, я всё поняла. Блин.. Сорряньте
Zhan Peskov
Уровень 35, Москва, Россия
7 сентября 2020, 11:04
вот какого ражна для этой задачи нужны регулярки ??? удаление через них и тд это перераспределение памяти и прочее На сколько я понимаю ByteArrayOutputStream уже хранит в себе массив байт который просто надо правильно отработать и вуаля
Дмитрий Яковенко
Уровень 35, Москва
17 сентября 2020, 14:10
ByteArray - хранит байты, а проверять нужно символы. Поэтому .toString в любом случае нужен. А дальше - на вкус и цвет, хочешь проверяй в массиве и сравнивай посимвольно, хочешь напиши регулярку, которая в целом делает тоже самое.
Zhan Peskov
Уровень 35, Москва, Россия
17 сентября 2020, 14:33
не согласен, где Вы тут у меня .toString() увидели ? try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos)) { PrintStream consoleStream = System.out; System.setOut(ps); testString.printSomething(); System.setOut(consoleStream); for (byte letter : baos.toByteArray()) { if (letter >= 48 && letter <=57) { System.out.print((char) letter); } } } и да, числовые символы от их байтовых собратьев отличаются ровно на 48 поэтому и написал, раз по условию задачи и так сначала все должны вывести в массив байт, то зачем тогда городить огород со строками и регулярками если осталось только по этому массиву пробежаться и найти числа Что я не так написал в первом посте ??? 😉
Дмитрий Яковенко
Уровень 35, Москва
17 сентября 2020, 15:37
Повторюсь - байты и символы - не одно и тоже. Пока Вам на вход дают английские буквы и цифры - вроде разницы нет. Но как только на входе окажется кириллица или спецсимволы или изменена кодировка - логика работы может быть нарушена, так как размер символа будет больше байта. Подробнее.
Zhan Peskov
Уровень 35, Москва, Россия
17 сентября 2020, 16:02
В данной конкретной задаче так использовать можно скажем 0 = код 48 = 0x30 если даже взять символ ‰ у которого младший байт тоже 0x30 (чего Вы имеено и опасаетесь у меня) то он будет представлен аж 3-мя байтами с отрицательным значением и 48 не проскочит !!!
Дмитрий Яковенко
Уровень 35, Москва
17 сентября 2020, 16:48
Итого, на одной чаще весов мы имеем: 1) Странное сравнение байтов и символов, где ещё надо знать, что байты выше 127 кодируются строго отрицательными байтами 2) Странный диапазон байтов от 48 до 57, где ещё надо помнить, что это цифры 3) Сомнительный выигрыш по скорости, так как печатаем посимвольно 4) Сомнительную архитектуру, вынуждающую оптимизировать скорость ввода с консоли А на другой чаще весов мы имеем:
System.out.println(outputStream.toString().replaceAll("\\D", ""));
Простой и понятный код. Даже не знаю, какую сторону весов выбрать))) PS: и да, я потестировал, на относительно длинных входных данных - Ваш метод начинает проигрывать по скорости.
Zhan Peskov
Уровень 35, Москва, Россия
17 сентября 2020, 18:03
это потому что у меня много долгоиграющих вызовов в консоль (по каждому символу) а вот если соревноваться именно на скорость (при не сильно раздутом коде конечно же), то вот моя такая переработанная конструкция for (int i = 0; i < 10000; i++) { char[] chars = new char[baos.size()]; int counter = 0; for (byte letter : baos.toByteArray()) if (letter >= 48 && letter <=57) chars[counter++] += (char) letter; String result = String.valueOf(chars, 0, counter); } от 3 до 20!!! раз быстрее Вашего кода for (int i = 0; i < 10000; i++) { String result = baos.toString().replaceAll("\\D", ""); } что доказывает мою правоту что работа со строками и перераспределение памяти это долго
10 августа 2020, 14:17
я раньше боялся этих регулярок как огня, пару часов потратил, поразбирался, поковырял и жизнь наладилась. Пришел к этой задаче и пфф...изи.