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

  • 16
  • Недоступна
Итак, полиморфизм. Вы о нём ещё не забыли? Тогда решаем следующую задачку: считываем с консоли данные, пока не будет введено слово "exit". Для каждого значения, кроме "exit", вызываем метод print, какой именно принт — зависит от значения. Например, если значение содержит точку, то вызываем print для Double, а если это число от 0 до 128 — то для short.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (488)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Murad
15 уровень, Москва
позавчера, 18:24
Кто нибудь обьяснит почему проверка(парсинг) Integer должен стоять раньше short? У меня было сначала short потом integer, не проходило, поменял местами и сразу норм. ТОлько логики не понял, пытаюсь понять зачем так сделали
Куприянов Денис
16 уровень, Харьков
9 апреля, 19:39
Написал программу через регулярные выражения, но она не проходила по условию проверки на Double! И вот незадача! Мне как то удобнее применять при считывании с клавиатуры класс scanner! А оказалось, что переписаная реализация, у других людей, через BufferedReader работает, а моя - нет.... Обидненько, но причина в разнице между сканнером и буфером. Она в том, что при установленной локализации не US сканнер считывает числа не с точкой, а с запятой Т_Т И именно из за этого компилятор не пропускает результат, ведь он использует для проверки точку. Так что, дамы и господа, учитывайте этот нюанс при написании своего решения :) Ну и для себя, на будущее, при написании решений задачь чаще буду использовать bufferedReader ;)
Дмитрий
33 уровень, Витебск
2 апреля, 15:26
Решил через вложенный try-catch в блоке try. Первый try - попытка спарсить double значение, второй try - попытка спарсить int значение.😎
Дмитрий
24 уровень, Москва
18 марта, 19:44
почему не проходит ничего в валидаторе?
try { i = Integer.parseInt(s);} catch (NumberFormatException e){}
         if (s.contains(".")) print(Double.valueOf(s));
         else if (i <= 0 || i >=128) print(i);
         else if (i > 0 && i <128) print((short) i);
         else print(s);
Ксения
16 уровень
10 марта, 14:43
Блин, 5 попыток понадобилось чтобы понять что хочет валидатор. А хотел он, что проверка на Integer была раньше, чем на short.
Leo
19 уровень, Москва
16 марта, 15:57
Эмм, нет, видимо причина не в этом. Я писал вообще без проверки на Integer. Валидатор принял с первого раза.
Ксения
16 уровень
17 марта, 05:12
Может быть, но я больше ничего не меняла в коде, и валидатор принял. Уже посмотрела правильное решение, все оказалось куда проще)
Виктория Владимирова
16 уровень, Москва
21 марта, 20:15
Аналогичная фигня.
Murad
15 уровень, Москва
позавчера, 17:52
Почему Integer должен был стоять первым не понял
Asaf Yangaliev
20 уровень, Ташкент
4 марта, 14:04
Попробуйте использовать Регулярные выражения
Alexander Mul
20 уровень, Warsaw
27 февраля, 15:57
Решил с одним Трай-Кетч
Может кому то поможет
Баферридер буффер = новый Баферридур(новый ИнпутСтримРидер(Систем.Ин));
Стринг стр;
Вайл(!((стр = буффер.ридЛайн()).екуалс("ексит") {
     Трай {
            если (стр.контаинс(".")){
                принт(Дубл.парсеДубл(стр));
            }иначе если ((Интежер.парсеИнт(стр)) меньше либо равно 0 ИЛИ (Интежер.парсеИнт(стр)) больше или равно 128){
                принт(Интежер.парсеИнт(стр));
            }иначе если (Шорт.парсеШорт(стр) больше нуля И Шорт.парсеШорт(стр) меньше 128){
                принт(Шорт.парсеШорт(стр));
            }иначе
                принт(стр);
         }Катч (НамберФорматЕксцепшн е) {
                принт(стр);
         }
    }
Roman Grand
23 уровень, Новосибирск
9 марта, 00:40
ахах, напомнило YoptaScript
Руслан
17 уровень, Санкт-Петербург
14 февраля, 16:22
/* Конечно можно написать намного короче, но мне понятней пока так:
    Создаем поток ввода;
    Вечный цикл {
        Считываем строку с клавиатуры;
        если (строка ровна "exit") {
        выходим из цикла
        }
        проверяем на исключения {
            если (в строке есть точка) {
                вызываем метод для Double;
            }иначе если (преобразованная в число строка меньше либо равно нулю или больше либо равно 128){
                вызываем метод print() для Integer;
            }иначе если (преобразованная в число строка больше нуля, но меньше 128)
                вызываем метод print() для short;
        } поймали исключение (){
            вызываем метод print() для String.
        }
*/
Jewgienij
17 уровень, Wrocław
15 февраля, 19:12
согласно строке кода 10, выражение "java.rush" так же будет являтся числом типа double. Сам попался на этом :) Делал следующим образом (от 8 строки):
/*
парсим строку до инт
если (условие short){
int = (short) int;
print(short);}
else if (условие int){
print(int);}
}ловим исключение(исключение е){
проверяем еще раз на исключение{
парсим double;
print (double);
}
ловим исключение (исключение е1){
print (String);}
}
*/
Anonymous #2497433
23 уровень
17 февраля, 19:59
как у вас сработал код? я ловил исключение, но все равно не работал код... пришлось проверку на символы делать
Руслан
17 уровень, Санкт-Петербург
19 февраля, 13:51
Если ввести "java.rush", то выведет: "Это тип String, значение java.rush", потому что print(Double.parseDouble(string)); выбросит исключение и в catch исполнится код print(string);
Vladislav Enterprise Java Developer
10 февраля, 11:34
Может кто объяснит почему он кидает Exc при вводе строки не из числовых значений, не понимаю я🙁
Jewgienij
17 уровень, Wrocław
15 февраля, 19:14
что используешь: scanner или поток ввода? Вышли часть кода, где считываешь с консоли и заносишь значения в коллекцию
Vladislav Enterprise Java Developer
17 февраля, 18:42
Через поток ввода делал, но я уже допер, что когда парсим инты выскакивает исключение и до последенго else не доходит, поэтому вот вам пример как делать не надо
else if (Integer.parseInt(f) > 127 && Integer.parseInt(f) < 1) print(Integer.parseInt(f));
            else print(f);
Ilia lenskii
16 уровень, Санкт-Петербург
3 февраля, 18:52
Приходиться подгонять решение под валидатор, за такой подход -