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

  • 8
  • Недоступна
Итак, полиморфизм. Вы о нём ещё не забыли? Тогда решаем следующую задачку: считываем с консоли данные, пока не будет введено слово "exit". Для каждого значения, кроме "exit", вызываем метод print, какой именно принт — зависит от значения. Например, если значение содержит точку, то вызываем print для Double, а если это число от 0 до 128 — то для short.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (136)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
S3R3N1TY16 уровень, Санкт-Петербург
16 января, 13:26
Решил одним блоком  try catch, в catch вывод строки а также дополнительная проверка если строка  "exit"
REM15 уровень, Москва
16 января, 11:27
1. определил число это или нет, запарсил дабл. если ошибка то значит это стринг. 2. если это число, то проверяем если ли точка. значит дабл 3. иначе если 0 > ... <128, то шорт. 4. иначе это Интежер.
Вадим18 уровень, Новосибирск
8 января, 16:10
Думал с начало, что задачу можно решить с помощью matches...как же я ошибался)
Евгений16 уровень, Санкт-Петербург
28 декабря 2018, 10:10
Коллеги помогите! Что не так? Все вроде работает правильно?
IceBerg20 уровень, Днепр
23 декабря 2018, 18:11
Использовал один блок try, где проверял парсинг Double, в случае неудачи парсинг short/Iteger точно не пройдут уже, можно сразу вызывать принт строки в catch и продолжать цикл через continue. Если же try выполнился, то дальше всё просто - проверяем три условия if-ами, точку ищем в изначальной строке, а диапазоны проверяем значением Double, которое получили в блоке try.
Вит23 уровень
28 ноября 2018, 01:14
Может кому поможет мой вариант - валиадор принял все ок. 1.Запихиваем все в вечный цикл чз While. 2. Считываем строку. Если exit - то соответственно -break. 3. Далее через исключение в try пробуем запарсить Integer из строки. Если запарсили -прогоняем этот Integer - через if условие для short и печатаем с приведением print((short) Integer.parseInt(s)); в противном случае - это по-любому Integer (соответственно печатаем без приведения). 4. Далее в блоке catch указываем исключение (NumberFormatException e) и знаем, что остались либо String либо дробный любой формат числа(число с точкой) 5. Далее открываем в этом блоке catch еще одно исключение try { и пробуем здесь запарсить Double. Если получилось - печатаем print(Double.parseDouble(s)). 6. Если запарсить Double не получилось то в catch опять же указываем (NumberFormatException v) и тупо печатаем принятую на ввод строку.(В моем случае print(s)). Как-то так.
IceBerg20 уровень, Днепр
23 декабря 2018, 17:38
Можно ограничиться одним try запарсив Double, потом проверяем точку/short/Integer if-ами.
Константин16 уровень
пятница, 18:26
Почему у меня не принимал валидатор: использовал do ... while c обработкой "exit" как введеной строки. Только из-за этого...
Женя Воронкин20 уровень
22 ноября 2018, 15:21
не знаю почему, но проверка на условие Integer должно быть 1-й, был Short - не проходило.
Bazi4ek19 уровень, Минск
23 ноября 2018, 22:28
Скорее всего была возможность скормить методу Short.parseShort() стрингу со значением большим чем short, программа ловила исключение прямо внутри вашего if, не доходя до проверки для Integer
Prokofieva19 уровень, Харьков
21 ноября 2018, 17:09
2.3. меньше либо равно нулю ИЛИ больше либо равно 128, то вызвать метод print для Integer; ну капец, какая же я невнимательная! Писала через && вместо || Народ, кто то может объяснить почему важен порядок:?
}else if (Integer.parseInt(s) <= 0 || Integer.parseInt(s) >= 128) {
                    print(Integer.parseInt(s));
                }else if (Short.parseShort(s) > 0 && Short.parseShort(s) < 128) {
                    print(Short.parseShort(s));
                }
прочитала много коментов но так и не поняла до конца(
Anatoliy16 уровень
25 ноября 2018, 21:26
вы делаете избыточные проверки, это запутывает код. Если строка корректно распознана как int, то она заведомо будет корректно распознана как short. Достаточно первой проверки, вторая вам ничего не добавляет:
else if (Integer.parseInt(s) <= 0 || Integer.parseInt(s) >= 128)
   print(Integer.parseInt(s));
else
   print(Short.parseShort(s));
А вот наоборот неверно. Если строка не распозналась как short (вылетел эксепшен), то это еще не обозначает, что строка не может быть распознана как int. С другой стороны, short вмещает диапазон от -32768 до 32767, т.е. не всякое корректно распознанное как short число надо выводить в метод print(short), часть таких чисел надо отправлять в print(int). Это весьма усложнит код. Разумнее сразу проверить на int. Если ошибка, значит это и не int, и не short, а потом в зависимости от значения вызвать соответствующий метод.
Prokofieva19 уровень, Харьков
26 ноября 2018, 12:05
спасибо!
Иван23 уровень
19 октября 2018, 15:27
Выполнил как посоветовал Petr Gorskin 1) ввод в цикл 2)Try{ пункты 3,4,5 } 3) проверка equals("."), если да то печать Parse(нужный_тип) 4)проверка на Integer.parseInt 5)проверка на Short.parseShort 6) catch(написать исключение) // которое словим при попытке запарсить строку в число 7) написать метод для печати print(s);
Марина20 уровень
12 октября 2018, 15:41
Написала огромный код с if-ами, с try-ми, все работает... все замечательно... 2 раза не прошел валидатор! Полезла читать коммменты, говорят с большими числами не работает... и правда!!! говорит, что это стринг!
if (Integer.parseInt(line) <= 0 || Integer.parseInt(line) >= 128) {
    print(Integer.parseInt(line));
} else if (Short.parseShort(line) > 0 && Short.parseShort(line) < 128) {
    print(Short.parseShort(line));
}
В первую очередь была проверка на short, а потом на Integer: 1. большое число не подходило в short... то есть больше 128 2. но и проскакивало мимо блока с if, где проверка на Integer. Поменяла местами проверку и все прошло... не поняла, почему так... че к чему??? П.С.: дадада, можно было короче написать код.
gtfo23 уровень, Санкт-Петербург
8 ноября 2018, 19:16
Возможно, не актуально. Как я понимаю, это из-за того, что строка парсится в Short.parseShort() для сравнения и тут вылетает NumberFormatException и переходит в блок catch. Т.е. до Integer просто не доходит. Если вводить числа в диапазоне short, то он определяет нормально в Integer, а все что больше уже в String.
Марина20 уровень
10 ноября 2018, 18:53
Все равно спасибо :)))
fecaldestroyer16 уровень, Москва
22 ноября 2018, 11:11
поэтому лучше парсить в Int в блоках где идет сравнение (if,else if) а потом уже парсить в нужный тип.