Разные методы для разных типов

  • 8
  • Недоступна
Итак, полиморфизм. Вы о нём ещё не забыли? Тогда решаем следующую задачку: считываем с консоли данные, пока не будет введено слово "exit". Для каждого значения, кроме "exit", вызываем метод print, какой именно принт — зависит от значения. Например, если значение содержит точку, то вызываем print для Double, а если это число от 0 до 128 — то для short.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (210)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
y-grek15 уровень, Киев
3 часа назад
изначально (как бы ни было стыдно, полтора месяца назад) начал писать метод isParsableNumber(); думал с кетчами не пустит, типа слишком хитро.. промучился 3 дня и использовал пару-тройку попыток настолько расстроился, что эти полтора месяца не мог заставить себя засесть за Джавараш.. от слова "вообще" вот спустя много времени заставил себя сесть, перечитать лекции за 15й уровень, начал писать с выловом НамберФорматЕксепшн.. все пошло быстро но напутал с порядком проверки.. Ниже моя порядок действий: - читаем БуфердРидером и присваиваем первую строку переменной input вне цикла - цикл - пока input не "екзит" в блоке трай проверяем на: - наличие точки в строке, если есть парсим в Дабл и в принт().. если не парсонется словит НамберФорматЕксепшн; - если точки нет, проверяем спарсится ли в Интеджер и попадает ли в диапазон чисел, если да - в принт(); - если нет, проверяем спарсится ли в Шорт и попадает ли в диапазон, если да - в принт(); - остальное в принт() без конвертации; - если словило НамберФормат - в принт() без преобразования; - после трая-кетча читаем в инпут следующую строку; еще пару попыток испортил порядком проверки, если сначала проверять на шорт, а потом на интеджер - большой диапазон подходящих интеджеров улетали в ексепшн еще на проверке на шорт.. Поздравьте меня, я к вам вернулся, я за вами скучал.. =) =) =)
Дмитрий17 уровень, Омск
30 сентября, 09:38
Вы решили задачу лучше, чем 60% учеников. Вам удалось ее решить с 1 попытки. Среднее количество попыток для этой задачи 3.1. Всего эту задачу решили 19103 учеников.
Артём16 уровень
21 сентября, 08:07
B блоке try ловим проверку на int и short и на exit. А в catch if содержит "." double, else String.
Максим18 уровень, Владивосток
25 сентября, 14:48
ерунда, будет строка с точкой - будет эксепшн
Антон20 уровень, Одесса
7 сентября, 12:35
Спасибо команде сайта и ребятам из комментов - заставили оторвать пятую точку и разобраться наконец с регулярными выражениями!
Evgen15 уровень, Гродно
7 сентября, 04:01
Первый мой коммент что ли, кажется мое решение отличается от других или просто не увидел такое: 1. Проверка на String 2. Проверка на Double 3. Проверка на остальное. Притом не использовал исключения, хотя понимаю куда можно было бы впихнуть.
Александр16 уровень, Санкт-Петербург
6 сентября, 14:40
спасибо за регулярки! к черту эти try...catch )
omat_kisat20 уровень, MIPS Assembly
3 сентября, 11:24
Пока самое короткое решение (через один try...catch без повторов кода) у меня вышло такое: 1) я использую BufferedReader для чтения с консоли. И читаю, пока можно . 2) Пытаюсь запарсить полученное в число (класс Number):
Number n = NumberFormat.getInstance().parse(s);
3) если получилось, то проверяю, не содержит ли стринг s точки (".", никаких регэкспов), и если да – то вызываю принт на n.doubleValue(); 4) по аналогии проверяю на принадлежность к short и вызываю соответствующий принт, ну и если опять облом, но парсится – то тогда перед нами пан Интежер. 5) ловлю ParseException, сначала задаю условие выхода из цикла (и закрываю поток, да), потом зову печать на стринги. Валидатор вполне доволен. Примечание: класс Number не позволяет напрямую использовать операторы сравнения (>, <, ==), но позволяет это делать через некоторые методы numclassValue().
zolotokk19 уровень, Izhevsk
29 августа, 15:24
Решил через регулярные выражения без try - catch. Много раз if - else для выбора какой конкретно print вызвать. Уверен можно лучше код написать, учимся :)
Евгений19 уровень, Днепр
27 августа, 16:07
сам решил через частично через try/catch, но нашел такое: "Загонять в Integer или Double и ждать Exception, не есть очень хорошо! Программе приходиться останавливаться и собирать стектрейс, а это операция не быстрая. Тем более это не исключительная ситуация для вашей программы." поэтому лучшим вариантом решения будут регулярные выражения или через методы Scanner-а
Leftover20 уровень, Москва
29 августа, 12:41
На самом деле Scanner сам использует try/catch в методах hasNextInt() .... etc. Так что "шило на мыло", разве что для "более лучшей" читаемости кода :)
Евгений19 уровень, Днепр
29 августа, 18:56
хз, не встречал такого. Где почитать?
Leftover20 уровень, Москва
30 августа, 10:09
Можно в исходном коде посмотреть. Если в Идее кликнуть с Ctrl на Scanner откроется закладка с исходным кодом класса. Ну и там уже поиском :)
Алексей17 уровень, Санкт-Петербург
24 сентября, 16:36
а еще можно удалить e.printStackTrace из блока catch, тогда не будет его собирать. А вообще в методе Double.parseDouble() - самый быстрый из имеющихся механизм проверки на то является ли строка числом, так что его использование - это наоборот самое лучшее решение из возможных...
Galikhan Aysin20 уровень, Костанай
26 августа, 17:06
где-то в комментах наткнулся на решение задачи с помощью класса Scanner. И действительно с помощью него можно обойтись без ловли исключений. У класса есть методы которые мне помогли в решении: hasNextInt(), hasNextDouble(), nextInt(), nextDouble(), next() Конечно без дополнительного if else не обошлось, чтобы выделить диапазон в 0 - 128.
omat_kisat20 уровень, MIPS Assembly
3 сентября, 11:43
Сканнер хуже подходит для этой задачи, потому что у него нет метода для получения любого числа. И поэтому-то стектрейс придется собирать со всего, обрабатывая аж три NumberFormatException, но вы этого как бы не видите. То, что это делается имплицитно, не значит, что оно не делается вообще: это синтаксический сахарок, в общем-то, для более простого чтения кода и автоматического учета того, что необходимо учесть. С потоком для решения этой задачи достаточно поймать одно исключение – потому что ваш инпут либо может быть преобразован в число любого формата, либо нет.