• ,

level15.lesson12.home01

Код компилируется и работает корректно, но проверку не проходит. Подскажите в чем ошибка.

package com.javarush.test.level15.lesson12.home01;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader (new InputStreamReader(System.in));
        String console = reader.readLine();
        while (!console.equals("exit"))
        {

            try{
                if (console.contains("."))
                {
                    double Dbl = Double.parseDouble(console);
                    print(Dbl);
                }
                else if (Short.parseShort(console)>0 && Short.parseShort(console)<128)
                {
                    short Shorts = Short.parseShort(console);
                    print(Shorts);
                }
                else if (Integer.parseInt(console)>=128)
                {
                    int Inter = Integer.parseInt(console);
                    print(Inter);
                }
                else print(console);
            }
            catch (NumberFormatException e)
            {
                print(console);
            }
            console = reader.readLine();
        }

    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}<code>

92 комментария

DieMust
else if (Short.parseShort(console)>0 && Short.parseShort(console)<128)
если введешь число больше 128, то в этой строчке явно будет что-то не то.
Код выкладывай с тегами /<code/>
DieMust
точнее не больше 128, а больше Short.MAX_VALUE
Bessus
Спасибо за подсказку, буду думать. За подсказку по тегам отдельное спасибо!!!
d0wn
  • d0wn
  • 0
  • Комментарий отредактирован 2016-03-24 21:15:23 пользователем d0wn
мой валидированный вариант без try catch

while ( !(text=reader.readLine()).equals("exit") )
        {
            if ( text.contains(".") ) print(Double.parseDouble(text));
            else if (text.matches("\\d+") && (Integer.parseInt(text) > 0) && (Integer.parseInt(text) < 128) ) print(Short.parseShort(text));
            else if (text.matches("\\d+") && (Integer.parseInt(text) >= 128) ) print(Integer.parseInt(text));
            else print(text);
        }
        reader.close();
adil_sharipov
Отличный код!
Я решал с помощью try-catch, и нахожу это не самым лучшим способом.
Но скажи, что выдаёт компилятор, если введено, допустим, «jknfe.efrjk»?:)
The_Rebel
Да, вариант выше (без try catch) неправильный получается. Т.к. при введении текста с точкой, как раз и выскакивает непойманное исключение. Так что код совсем не отличный))
Sev
это жесть какая-то… При вводе строки с двумя точками вылетает ексепшн, но сайт код принимает… А код, в котором обрабатываются все возможные ошибки — не принимает -_-
Bessus
Программа прошла тестирование, еще раз спасибо!
AlexShaman
Подскажи в чём была проблема?
переделываю на протяжении 2-х часов — не понимаю как должно быть!!!
Работает, выводит всё по условию задачи, — а проверку не проходит…
Мой код

package com.javarush.test.level15.lesson12.home01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        String s;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true)
        {
            s = reader.readLine();
            if (s.equals("exit")) break;
            else
            try
            {
                if (s.contains("."))
                    print(Double.valueOf(s));

                else if (Short.parseShort(s) > 0 && Short.parseShort(s) < 128 )
                    print(Short.valueOf(s));

                else if (Integer.parseInt(s) >= 128)
                    print(Integer.valueOf(s));
                else print(s);

            }
            catch (NumberFormatException  e)
            {
                print(s);
            }
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}

hubert
Не работает, не выводит что нужно. Потому и не проходит
Советую, перед сабмитами на сервер проверять свой код.
Введи любое число от 32,767 до 2,147,483,647.
hubert
Тем более, выше комменты уже содержат все необходимые подсказки.
AlexShaman
Спасибо, иногда пинок под зад — большой шаг вперед!
alexnjc
Все проверил, по условию все правильно работает. Только смущает, что целые числа 0 и меньше определяются как String.
Проверку не проходит
Walmar
Ты сам написал свою ошибку)
alexnjc
Но этого же нет в условии, или это квест такой? ) Пробовал добавлять в строку else if (Integer.parseInt(s) >= 128) такое
else if (Integer.parseInt(s) >= 128 || Integer.parseInt(s) <= 0 ) — но все равно не система принимает задачу
Olexa
меньшие числа и ноль по условию должны определяться, как String. Проблему подсказал hubert выше, почему Integer выводит цифры до максимума short.
Treefeed
Сначала не понял, зачем ловить NumberFormatException, а потом ввёл «точка.точка»…
Mishutka
Подскажите, что я неправильно делаю???

package com.javarush.test.level15.lesson12.home01;


import java.io.IOException;
import java.util.Scanner;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        while (true)
        {
            Scanner scanner=new Scanner(System.in);
            String v=scanner.nextLine();
            if(v.equals("exit"))  break;
            try
            {
            if(v.contains("."))
            {
              print(Double.parseDouble(v));
            }


            else if(Integer.parseInt(v)>=128)
            {
             print(Integer.parseInt(v));
            }

            else if(Short.parseShort(v)>0&&Short.parseShort(v)<128)
            {
                print(Short.parseShort(v));
            }

                else print(v);
            }

                catch (NumberFormatException e)
                {
                    print(v);
                }


        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
Treefeed
Начнём с того, что
while (true)
        {
            if(v.equals("exit"))  break;
можно заменить на
while (!v.equals("exit"))
Mishutka
Спасибо, программа успешно прошла тестирование.
k7i3
  • k7i3
  • 0
  • Комментарий отредактирован 2014-01-29 18:46:34 пользователем k7i3
Не могу понять, что это изменяет… Почему после замены программу принимает, а до нет? Все-таки «можно» заменить или «необходимо» заменить?
Treefeed
Иногда нужен if else, а не только if. При причёсывании кода такая необходимость пропала.
k7i3
Про if else понятно, чтобы лишний раз не расходовать ресурсы на проверку условий, или чтобы переменная не попадала под несколько условий. Вопрос в другом, почему при использовании проверки на «exit» внутри цикла через break проверка не проходит, если же проверяем на входе while (!v.equals(«exit»)) — проходит. Что это меняет, мне просто интересно.
GabbazovRuslan
Дело не в этом. У меня например
while (true)
        {
            String str = reader.readLine();
            if (str.equals("exit")) break;
....

прошло. Тут дело в том что внутри цикла создавался сканнер каждый раз, а сие нельзя (физически можно но очень сильно неправильно с позиции ресурсов). Не первый раз вижу что такое не проходит. Вот и все.
stalin1943
  • stalin1943
  • -1
  • Комментарий отредактирован 2014-03-18 14:39:39 пользователем stalin1943
Потому что «exit» тоже должен выводиться на экран «Это тип String, а при таком варианте не будет выводится, можно просто переставить выход через break в другое место.
FedoraLinux
Ну вот зачем неправильно подсказывать?
По условию не сказано, что надо выводить exit, а также проверку не проходит, если учитывать exit.
stalin1943
А тогда в чём разница между выходом по break и по условию в while? Посмотри внимательнее, в одном случае попадает «exit», в другом — нет! А где сказано, что «exit» не должна выводится? В этом задании info.javarush.ru/JavaRush_tasks_discussion/2013/09/08/level13-lesson11-home04.html тоже не сказано про, то «exit» должен попадать в файл.
FedoraLinux
Ни в одном из случаев не попадает.
С while он заканчивает цикл, с if () break — выходит из цикла.
А где сказано, что «exit» не должна выводится?
Это не означает, что должна выводиться.
И говорю еще раз: с выводом exit проверку не проходит, без — проходит.
stalin1943
У меня с попаданием «exit» нормально прошла тестирование.
stalin1943
Обманул… перепутал с другим заданием. Пересмотрел выполненное задание, действительно — не попадает.
iliyaboev
В чем проблема, не могу уже время тратить на подбор вариантов, прошу помощи

public static void main(String[] args) throws NumberFormatException
    {
        String m;
        Scanner scanner = new Scanner(System.in);
        try
        {
            m = scanner.nextLine();
            while (!m.equals("exit"))
            {
                if ((m.matches("[1-9]+[0-9]*(.*)")) && (!m.contains(",")))

                {
                    if (m.contains(".")) print(Double.parseDouble(m));
                    else if (Integer.parseInt(m) > 0 && Integer.parseInt(m) < 128) print(Short.valueOf(m));
                    else if (Integer.parseInt(m) >= 128) print(Integer.parseInt(m));
                } else print(m);
                m = scanner.nextLine();
            }
        }
        catch (NumberFormatException e)
        {
            System.out.println(e);
        }
    } 
Anton_n
Short.valueOf(m) дает Short, а нужно short.
iliyaboev
сделал так- (short)Integer.parseInt(m) не помогло, кто поможет — поставлю плюс, выручайте
Anton_n
Я думаю, тут надо сначала пункт 1 выполнить, а потом уже пункт 2. Чтобы ввод и вывод не были вперемешку.
Bessus
Попробуй ввести строку «44ff», должно вывести это тип String.
Вообще не советовал бы использовать регеспы там, где не надо, здесь легко можно обойтись без них.
iliyaboev
да, правильно, не определяло как строку, +
TRBLG
  • TRBLG
  • 0
  • Комментарий отредактирован 2014-05-15 21:57:30 пользователем TRBLG
не могу понять. почему
<> else if (Integer.parseInt(s) >= 128) print(Integer.parseInt(s))>
вылетает при значении 123456 когда максимум для инта 2*10^9-1. такое чувство, что там short а не int
TRBLG
  • TRBLG
  • 0
  • Комментарий отредактирован 2014-05-15 22:16:02 пользователем TRBLG
Все. дошло. столько тупил… жесть(
mironec
У меня вопрос, как всё-таки вызвать метод print Double? Структура
if (value.equals("."))
                print(Double.parseDouble(value));

выводит что это String
mironec
Привожу весь код
public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String value;

        while (!(value = reader.readLine()).equals("exit"))
        {
            try{

            if (value.equals("."))
                print(Double.parseDouble(value));
           else if ((short)Integer.parseInt(value) > 0 && (short)Integer.parseInt(value) < 128)
                print(Short.parseShort(value));
           else if (Integer.parseInt(value) >= 128 )
                print(Integer.parseInt(value));
            else print(value);

            }catch (NumberFormatException e)
            {
                print(value);
            }
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
mironec
точнее эта структура не работает
mironec
снимаю вопрос. Решил.
Svejk
  • Svejk
  • 0
  • Комментарий отредактирован 2014-06-24 17:21:51 пользователем Svejk
Не могу вдуплить. Если в коде ниже убрать continue, то при вводе значения с точкой (например 1.2) программа выведет
Это тип Double, значение 1.2
Это тип String, значение 1.2
т.е. получаем NumberFormatException, почему так?
public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String input = br.readLine();
            if (input.equals("exit")) break;
            try
            {
                if (input.contains(".")) {print(Double.parseDouble(input)); continue;}
                if (Integer.parseInt(input) > 0 && Integer.parseInt(input) < 128) print(Short.parseShort(input));
                if (Integer.parseInt(input) >= 128) print(Integer.parseInt(input));
            }
            catch (NumberFormatException e)
            {
                print(input);
            }
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
Dmitriy_Ivanov
  • Dmitriy_Ivanov
  • 0
  • Комментарий отредактирован 2014-07-02 11:56:45 пользователем Dmitriy_Ivanov
Оператор continue позволяет «досрочно» закончить выполнение тела цикла и вернуться в его начало (к очередной проверке условия while). Если ты убираешь continue, то введенная тобой строка «1.2» после успешной проверки на принадлежность к Double и вывода его на экран, начинает проверять его же на Short и Integer. Тут и возникает Exception… потому что и Short.parseShort(«1.2») и Integer.parseInt(«1.2») выдадут Exception. Тут лучше применить if… else if… else if…
SwiftAdviser
Капец… Всё нормально работает в компиляторе… Но почему на сервере не проходит?!
package com.javarush.test.level15.lesson12.home01;


import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Scanner;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        Scanner scn = new Scanner(System.in);

        while (true) {
            String a = scn.nextLine();
            if (a.equals("exit")) break;

            try {
                if (a.contains(".")) {
                    print(Double.valueOf(a));
                } else if (Short.parseShort(a) > 0 && Short.parseShort(a) < 128) {
                    print((short)Integer.parseInt(a));
                } else if (Integer.parseInt(a) >= 128) {
                    print(Integer.parseInt(a));
                } else {
                    print(a);
                }
            }
            catch (NumberFormatException e) {
                print(a);
            }
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
Bessus
Первый же комментарий к этому типику указывает на твою ошибку.
Попробуй ввести 32768, должно вывести Integer, а у тебя что выведет?
Bestlis
  • Bestlis
  • 0
  • Комментарий отредактирован 2014-09-25 18:18:45 пользователем Bestlis
public static void main(String[] args) throws IOException {
//напиште тут ваш код
 BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));

String s = "";

while (true)
 {
 s = rd.readLine();

if (s.equals(«exit»))
 break;

try
 {
 Double d;
 if(s.indexOf('.') > 0)
 {
 d = Double.parseDouble(s);
 print(Double.parseDouble(s));
 }
 else
 {
 Integer n = Integer.parseInt(s);
 
 if (n > 0 && n < 128)
 print(Short.parseShort(s));
 else if(n >= 128)
 print(n);
 else
 print(s);
 }
 }
 catch (Exception ex)
 {
 print(s);
 }
 }
}
Garagon
Почему не принимает?

package com.javarush.test.level15.lesson12.home01;




import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
      
        ArrayList<String> mas = new ArrayList<String>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true)
        {
            String val = reader.readLine();
            if(val.equals("exit"))
            {break;}
            mas.add(val);
        }

        for (int i = 0; i < mas.size(); i++)
        {
try{
            if(mas.get(i).contains("."))
            {
              Double a= Double.parseDouble(mas.get(i));
                print(a);
            }else
                if (Short.parseShort(mas.get(i))>0 && Short.parseShort(mas.get(i))< 128)
                {

                    print(Short.parseShort(mas.get(i)));

                }else if(Integer.parseInt(mas.get(i)) >= 128)
                {
                    print (Integer.parseInt(mas.get(i)));
                }

}catch (Exception e){

        print(mas.get(i));
        }

    }}

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
MrG
  • MrG
  • 0
В задаче есть неправильный момент в условии.
По условию любое число без точки большее 128 должно вызывать метод print для Integer. Если ввести число более 2 147 483 647, то метод print вызовется для Double, хотя при вводе числа точки не было.
Самое интересное, что сервер принимает данный ответ. :)
MrBaseMax
Подскажите, где я неправильно понял условие задачи?

    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String> arr = new ArrayList<String>();

        String s ="";
        short sh = 0;
        Double d = null;
        long l = 0;


//        1. Считать с консоли данные, пока не введено слово "exit".
        s = reader.readLine();
        while(!s.equals("exit")) {
            arr.add(s);
            s = reader.readLine();
        }
        reader.close();

//        2. Для каждого значения вызвать метод print.
        for (int i = 0; i < arr.size(); i++) {
            s  = arr.get(i);
            if (s.contains(".")) {       // 2.1. Если значение содержит точку '.', то
                try {
                    d = Double.parseDouble(s);
                } catch (NumberFormatException e) {
                    d = null;
                }
                print(d);                // вызвать print для Double;
            }
            else {
                try {
                    l = Long.parseLong(s);
                } catch (NumberFormatException e) {
                    print(s); continue;
                }
                if (l > 0 && l < 128) {sh = (short) l; print(sh);} // 2.2. больше нуля, но меньше 128, то вызвать print для short;
                else if (l >= 128) print((int) l); // 2.3. больше либо равно 128, то вызвать print для Integer;
                else print(s); // 2.4. иначе, вызвать print для String.
            }
        }
    }


Ввод/вывод:
5.5
-0.5
2147483648.0
dfgdfg.asasd
456.563.234

1
127
128
2147483700
0
-456
-2147483700
/4*(
// два пробела
exit
Это тип Double, значение 5.5
Это тип Double, значение -0.5
Это тип Double, значение 2.147483648E9
Это тип Double, значение null //т.к. преобразовать к Double невозможно, но но условию метод такой.
Это тип Double, значение null //т.к. преобразовать к Double невозможно, но но условию метод такой.
Это тип Double, значение null //т.к. преобразовать к Double невозможно, но но условию метод такой.
Это тип short, значение 1
Это тип short, значение 127
Это тип Integer, значение 128
Это тип Integer, значение -2147483596 //так преобразуется из long
Это тип String, значение 0
Это тип String, значение -456
Это тип String, значение -2147483700
Это тип String, значение /4*(
Это тип String, значение
MrBaseMax
  • MrBaseMax
  • 0
  • Комментарий отредактирован 2014-12-22 19:09:20 пользователем MrBaseMax
Разобрался.

Если точку содержит НЕ число, а всякая ерунда типа «dfgdfg.asasd», «456.563.234», "…", то работаем через String. Слово «значение» в условии задачи, оказывается, подразумевает проверку на число и пониматься как «значение переменной» (в т.ч. строковой) не должно. Кроме последней строки условия задачи. Там под «иначе» подразумеваются уже как числа, так и строки, символы и пр.

Все остальные нелогичные условия типа «отрицательные целые числа и 0 выводить как String» или «числа, которые больше, чем Integer (2147483647), все равно выводить как Integer» воспринимать буквально.

Надеюсь, кому-то поможет.
Smart_Fox
Подскажите что не правильно в решении задачи, вроде как все по условию работает, но на серваке не проходит проверку.
package com.javarush.test.level15.lesson12.home01;


import smartfox.util.CountingGenerators;

import java.io.IOException;
import java.util.Scanner;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        Scanner console = new Scanner(System.in);

        while (console.hasNext()) {
            String line = console.nextLine();

            if ("exit".equals(line))
                break;

            if (line.indexOf('.') > 0) {
                try {
                    Double d = Double.parseDouble(line);
                    print(d);
                    continue;
                } catch (NumberFormatException ignore) { }
            }

            try {
                int i = Integer.parseInt(line);
                short value = 128;//Short.MAX_VALUE;
                if (i > 0 && i < value)
                    print((short) i);
                else if (i >= value)
                    print(i);
                else print(line);

            } catch (NumberFormatException e) { print(line); }
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
eniqen
import smartfox.util.CountingGenerators;
hubert
где вы их берете?
eniqen
кто — нибудь знает почему порядок проверки на Типы числа в условиях влияет на принятие решения сервером?
например дабл
инт
шорт
стринг
принимает, а если сделать
дабл
шорт
инт
стринг
то нет
Corwin
Потому что, когда ты используешь метод parseShort, все что больше типа short 32767 он урезает.
ioc0
  • ioc0
  • 0
  • Комментарий отредактирован 2015-06-25 12:26:46 пользователем ioc0
Подскажите пожалуйста где ошибка? Проверку не проходит. Но все, что просят код делает.

<code>package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        //BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        //String text = reader.readLine();
        Scanner scanner = new Scanner(System.in);
        String text = scanner.next();

        while(!text.equals("exit")){


            try
            {

                if(text.contains(".")){

                    double dbl = Double.parseDouble(text);

                    print(dbl);
                    break;
                }
                else {
                    int intg = Integer.parseInt(text);
                    if(intg>=128){
                        print(intg);
                        break;
                    }else if(intg<128){
                        short shrt = Short.parseShort(text);
                        if(shrt>0&&shrt<128){
                            print(shrt);
                            break;
                        }
                    }
                }





            }catch (NumberFormatException e){
                print(text);
                break;
            }


            }
        }


    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
</code>
ioc0
Поправил код теперь точно все делает, но сервер не принимает.
package com.javarush.test.level15.lesson12.home01;



import java.io.IOException;

import java.util.Scanner;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException
    {

        while (true)
        {
            Scanner scanner = new Scanner(System.in);
            String text = scanner.next();

            while (!text.equals("exit"))
            {
                try
                {

                    if (text.contains("."))
                    {

                        double dbl = Double.parseDouble(text);

                        print(dbl);
                        break;

                    } else
                    {
                        int intg = Integer.parseInt(text);
                        if (intg >= 128)
                        {
                            print(intg);
                            break;
                        } else if (intg < 128)
                        {
                            short shrt = Short.parseShort(text);
                            if (shrt > 0 && shrt < 128)
                            {
                                print(shrt);
                                break;
                            }
                        }
                    }
                }
                catch (NumberFormatException e)
                {
                    print(text);
                    break;

                }
            }
            if(text.equals("exit")) break;
        }

    }
    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}


пример I/O

/usr/lib/jvm/java-8-oracle/bin/java -Didea.launcher.port=7532 -Didea.launcher.bin.path=/home/ioc0/Загрузки/idea-IC-141.1010.3/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/home/ioc0/Dropbox/JavaRush/JavaRushHomeWork/out/production/JavaRushHomeWork:/home/ioc0/Загрузки/idea-IC-141.1010.3/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain com.javarush.test.level15.lesson12.home01.Solution
.
Это тип String, значение .
12
Это тип short, значение 12
33222
Это тип Integer, значение 33222
232.21
Это тип Double, значение 232.21
kol
Это тип String, значение kol
exit

Process finished with exit code 0
aid
  • aid
  • 0
public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код

        while (true){
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String in = reader.readLine();
        try {
        if (in.equals("exit")) break;
        else if (in.contains(".")) print(Double.parseDouble(in));
        else if (Integer.parseInt(in)> 0 && Integer.parseInt(in) < 128)  print(Short.parseShort(in));
        else if (Integer.parseInt(in)>= 128) print(Integer.parseInt(in));
        else print(in);
        }
        catch (NumberFormatException e)
        {
            print(in);
        }

        }


        }



    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}

Не понимаю почему не проходит, проверил, все правильно отрабатывает… видно чего — то не вижу… где ошибка?
aid
Нашел :)
Builder
  • Builder
  • 0
  • Комментарий отредактирован 2015-07-16 17:11:26 пользователем Builder
Еще один вариант решения задачи, но сервер не принимает… Подскажите в чем причина?

import java.io.*;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово «exit».
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
public static void main(String[] args) throws IOException {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s;

while (!(s = reader.readLine()).equals(«exit»)) {
try {
if (s.contains(".")) {
double d = Double.parseDouble(s);
print(d);
} else if (Short.parseShort(s) > 0 && Short.parseShort(s) < 128) {
short sh = Short.parseShort(s);
print(sh);

} else if (Integer.parseInt(s) >= 128) {
int in = Integer.parseInt(s);
print(in);
} else {
print(s);
}

} catch (NumberFormatException e) {
print(s);
}

}
}

public static void print(Double value) {
System.out.println(«Это тип Double, значение » + value);
}

public static void print(String value) {
System.out.println(«Это тип String, значение » + value);
}

public static void print(short value) {
System.out.println(«Это тип short, значение » + value);
}

public static void print(Integer value) {
System.out.println(«Это тип Integer, значение » + value);
}
}
Builder
Разобрался))Сервер принял, спасибо за подсказки выше!
Hastiel
Доброго времени суток!
Подскажите, пожалуйста, по данной задачке. Решил подойти к решению с использованием регэкспов, для проверки выражений на валидность. Как вы уже догадались, решение не принимается:
package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String result;
        while (true)
        {
            result = reader.readLine();
            try
            {
                if (result.equals("exit")) break;
                if (doubleMatch(result)){
                    print(Double.parseDouble(result));
                } else
                if (shortMatch(result)){
                    print(Short.parseShort(result));
                } else
                if (integerMatch(result)){
                    print(Integer.parseInt(result));
                }
                else print(result);
            }catch (NumberFormatException e){
                System.out.println(e.getStackTrace());
            }
        }
        //напиште тут ваш код
    }

    public static boolean doubleMatch(String result)
    {
        Pattern p = Pattern.compile("[0-9]+\\.[0-9]+");
        Matcher m = p.matcher(result);
        return m.matches();
    }

    public static boolean shortMatch(String result)
    {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher(result);
        if (m.matches()){
            Integer tmp = Integer.parseInt(result);
            return ((tmp > 0) && tmp < 128) ? true : false;
        }
        return false;
    }

    public static boolean integerMatch(String result)
    {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher(result);
        if (m.matches()){
            Integer tmp = Integer.parseInt(result);
            return tmp >= 128  ? true : false;
        }
        return false;
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}


Вопрос: я накосячил в логике, или не стоит юзать регэкспы?
Спасибо!
Fry
в логике =)) и не стоит юзать регекспы, там решения в 5 строк
vavilen
Да нормально все с регулярками.
Я пользовал для определения факта "іелое число", "\\d+", все норм.
hotR1de
Добрый день.
Подскажите где ошибка, компилируется, работает, но проверку не проходит.

package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException
    {
        //напиште тут ваш код

        while (true){
            String tmp = (new BufferedReader(new InputStreamReader(System.in))).readLine();
            try{
                if(tmp.equals("exit")){
                    break;
                }
                else if(tmp.contains(".")){
                    print(Double.parseDouble(tmp));
                }
                else if(Integer.parseInt(tmp)>0 && Integer.parseInt(tmp)<128){
                    print(Short.parseShort(tmp));
                }
                else if(Integer.parseInt(tmp)>=128){
                    print(Integer.parseInt(tmp));
                }
                else{
                    print(tmp);
                }
            }
            catch (NumberFormatException e){
                print(tmp);
            }

        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}

Retrat
else if (Integer.parseInt(x) > 0 && Integer.parseInt(x) < 128)
                {
                    print((short) (Integer.parseInt(x)));

Решил задачу вот такой строкой. Во всех ранее выложенных примерах при вышеуказанной проверки строка приводилась в short и проверялось условие. В итоге когда я строку привел к целому число и уже в методе «принт» явно привел его к шорт то все прошло…
Foxandr
Добрый день. У меня другая беда — при отправке решения на сервер получаю ответ «Неизвестная ошибка при работе с сервером». В чем может быть проблема?
GregPro
походу сервер того
GregPro
всё, точно что-то с серваком. простейшие вещи не принимает
Foxandr
всем спасибо — обновил плагин и все заработало!
victorrr
Подскажите, что не так?
У меня код полностью отрабатывает, а тестирование не проходит.
package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String a="";
        while (true)
        {
            a = reader.readLine();
           if (a.equals("exit")) {break;}
            if (a.equals("0")) {print(a);}
            if (!isNoLetters(a)) {print(a);}
            else
            try {

                if (a.contains("."))
                {
                    print(Double.parseDouble(a));
                }
                     else {
                                 if (Integer.parseInt(a) < 128 && Integer.parseInt(a) > 0)
                                    {
                                     print((short) (Integer.parseInt(a)));
                                    }
                                 else
                                 {                ;
                                    if (Integer.parseInt(a) >= 128)
                                    {
                                        print( (Integer) (Integer.parseInt(a)));
                                    }

                                 }
                            }

                 } catch (NumberFormatException e )

                      { print (a);}
        }

    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
    public static boolean isNoLetters (String a)
    {
        boolean result = true;
        HashSet <Character> numbers = new HashSet<Character>();
        numbers.add('0');
        numbers.add('1');
        numbers.add('2');
        numbers.add('3');
        numbers.add('4');
        numbers.add('5');
        numbers.add('6');
        numbers.add('7');
        numbers.add('8');
        numbers.add('9');
        numbers.add('.');
        for (int i=0; i<a.length();i++)
        {if (!numbers.contains(a.charAt(i))){result = false;}}
            return result;
    };
}
eney05
Прошу конструктивную критику, и почему не принимает сервер

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String s = null;
        Double d = 0.0;
        Integer i = 0;
        short sh = 0;
        while (true)
        {
            s = reader.readLine();
            if (s.equals("exit"))
            {
                break;
            } else if (checkStringIn(s))
            {
                i = Integer.parseInt(s);
                if (i > 0 && i < 128)
                {
                    sh = Short.valueOf(s);
                    print(sh);
                } else
                {
                    print(i);
                }
            } else

                if (checkStringDo(s))
                {
                    d = Double.parseDouble(s);
                    print(d);
                } else
          {
                print(s);
            }
        }
        //напиште тут ваш код
    }

    public static boolean checkStringIn(String string)
    {
        try
        {
            Integer.parseInt(string);
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }

    public static boolean checkStringDo(String string)
    {
        try
        {
            Integer.parseInt(string);
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }

    public static void print(Double value)
    {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value)
    {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value)
    {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value)
    {
        System.out.println("Это тип Integer, значение " + value);
    }
}


Joysi
  • Joysi
  • 0
  • Комментарий отредактирован 2016-02-17 23:02:25 пользователем Joysi
1. не срабатывает, например для:
.2
Это тип String, значение .2

2. Два идентичных метода с разными названиями
2bzik
Объясните плиз, как мы тут юзаем трай и кетч? предполагаю что проблема в стринговой части со стринговым методом)) но сам допереть не могу
2bzik
похоже допер, в if-ах вызываются parsDoble parsInt и тд методы, и когда идет проверка условия if туда попадают «буквы» которых там быть не может и получается ексепшон… правильно мыслим?
fonSolod
package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name = reader.readLine();

        while ((!name.equals("exit")))
        {

            if (isDouble(name)) {
                print(Double.parseDouble(name));
            }

            else if (isShort(name)) {
                print((short)Integer.parseInt(name));
            }
            else if (isInt(name)) {
                print(Integer.parseInt(name));
            }
            else {
                print(name);
            }


            name = reader.readLine();


        }




        //напиште тут ваш код
    }
    public static boolean isNumber(char a) {
        return (a=='1'||a=='2'||a=='3'||a=='4'||a=='5'||a=='6'||a=='7'||a=='8'||a=='9'||a=='0'||a=='.');
    }
    public static boolean isShort(String val) {
        try {

            if (Integer.parseInt(val)>0&&Integer.parseInt(val)<128)
            {return true;}
            else {return false;}

        }
        catch (Exception e) {
            return false;
        }
    }
    public static boolean isInt(String val) {
        try {

            if (Integer.parseInt(val)>=128)
            {return true;}
            else {return false;}

        }
        catch (Exception e) {
            return false;
        }
    }
    public static boolean isDouble (String val) {
        int d=0;
        boolean n=true;
        for (int i = 0; i < val.length(); i++)
        {
            if (val.charAt(i) == '.')
            {
                d++;
            }
            if (!isNumber(val.charAt(i)))
            {
                n = false;
            }
        }
        return  (d==1&&n);
    }
    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}

Сами мы люди не местные, «поможите чем можите». Не принимается сервером, хоть ты тресни
Exception
Я всё сделал через try и catch если в try во время преобразования выкинул ошибку значит переходим к следующему блоку, длинновато получается но зато работает.(

try  {
                Short tmp = Short.parseShort(temp);

                if (tmp > 0 && tmp < 128)
                {
                    print(tmp);

                }
                else
                throw  new NumberFormatException()
};
это только часть кода, если кто то ищет подсказку.

Выше встречал более элегантное решение,
while ( !(text=reader.readLine()).equals("exit") )
        {
            if ( text.contains(".") ) print(Double.parseDouble(text));
            else if (text.matches("\\d+") && (Integer.parseInt(text) > 0) && (Integer.parseInt(text) < 128) ) print(Short.parseShort(text));
            else if (text.matches("\\d+") && (Integer.parseInt(text) >= 128) ) print(Integer.parseInt(text));
            else print(text);
        }
        reader.close();

Но меня смущает один момент а если будет введено к примеру 2 точки 12.2.3 или ещё что то в этом духе…
Программа выдаст ошибку о преобразовании.
IIIu63uK
Почему сервер не принимает решение?
package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String readValue = null;

        do
        {
            readValue = reader.readLine();
            try
            {
                if (readValue.equals("exit"))
                {
                    break;
                } else if (readValue.indexOf(".") >= 0)
                {
                    double doubleValue = Double.parseDouble(readValue);
                    print(doubleValue);
                } else if (Short.parseShort(readValue) > 0 & Short.parseShort(readValue) < 128)
                {
                    Short shortVale = Short.parseShort(readValue);
                    print(shortVale);
                } else if (Integer.parseInt(readValue) >= 128)
                {
                    Integer integerValue = Integer.parseInt(readValue);
                    print(integerValue);
                } else
                {
                    print(readValue);
                }
            }
            catch (NumberFormatException e)
            {
                print(readValue);
            }
        }
        while (true);
    }

    public static void print(Double value)
    {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value)
    {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value)
    {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value)
    {
        System.out.println("Это тип Integer, значение " + value);
    }
}
Victor34
Замучался! Вот вывод программы:
1.01
Это тип Double, значение 1.01
147
Это тип Integer, значение 147
146
Это тип Integer, значение 146
127
Это тип short, значение 127
555555
Это тип Integer, значение 555555
-5
Это тип String, значение -5
;lkl
Это тип String, значение ;lkl
.
Это тип String, значение.
.2
Это тип String, значение .2
23.23.5
Это тип String, значение 23.23.5
exit

Process finished with exit code 0

Вот код, сам «кодил» не копировал:
package com.javarush.test.level15.lesson12.home01;


import java.io.IOException;
import java.util.Scanner;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        Scanner sc = new Scanner(System.in);
        //нужно считывать, а потом определять, что считал.
        //создать строку и присваивать считываемые значения

            /*а теперь нужно разложить
                   *  строку в массив символов. проверять массив в цикле:
                   *  проверить массив на наличие каких либо символов кроме чисел и точки.
           * если побочные знаки имеются, вызвать метод принт для стринг и выйти на начало цикла (continue).
           * если содержит одну точку '.', то преобразовать строку в Double, вызвать метод print для Double и выйти на начало цикла
                *    затем преобразовать строку в число Integer и делать такую проверку:
           * если больше нуля, но меньше 128, то преобразовать строку в short и вызвать метод print для short  и выйти на начало цикла
           * если  число больше или равно 128 (больше 127), вызвать метод print для Integer и выйти на начало цикла
           * если цикл не закончен, то вызвать метод print для String.
           * цикл закончить(закрыть).
                  *  Закрыть поток.*/

         String s = null;
        //создать цикл
        while (true){
            s =sc.nextLine();
            if (s.equals("exit")== true) break;
           char sm[] ;// строку в массив символов
            sm = s.toCharArray();
            boolean b = false;
            for (int i = 0; i < s.length();i++){  //  проверить массив на наличие каких либо символов кроме чисел и точки.
                if (!(Character.isDigit(sm[i]) || sm[i] == '.' )) {
                    print(s);//если побочные знаки имеются, вызвать метод принт для стринг и выйти на начало цикла
                    b = true;
                    break;
                }
            }
            if (b) continue;
            int n = 0;
            for (int i = 0; i < s.length();i++){
                if ( sm[i] == '.' ) {
                    n ++;
                }
            }
            if (n == 1 && s.length() == 1){//если строка из одной точки
                print(s);
                continue;
            }
            if (sm[0] == '.')//если точка первая
            {
                print(s);
                continue;
            }
            if (n == 1){// если содержит одну точку '.', то преобразовать строку в Double, вызвать метод print для Double и выйти на начало цикла
                print(Double.parseDouble(s));
                continue;
            }
            else  if (n == 0){//если точек не содержит то проверить на:
                Integer a = Integer.parseInt(s);
                if (128 <=  a) {
                    print(a);
                    continue;
                }
                if (a > 0 && a < 128){ //если больше нуля, но меньше 128,
                    short c = Short.parseShort(s);//то преобразовать строку в short и вызвать метод print для short  и
                    print((short) c);
                    continue;// выйти на начало цикла
                }
            }


            print(s);// если все варианты не подходят, вызываем принт стринг
        }
        sc.close();
    }

Что ему нужно? Подскажите, пожалуйста, кто может.
Docktor91
-2.5
Victor34
-2.5 дает ответ string, как и положено. Это решается в этом блоке:
for (int i = 0; i < s.length();i++){  //  проверить массив на наличие каких либо символов кроме чисел и точки.
                if (!(Character.isDigit(sm[i]) || sm[i] == '.' )) {
                    print(s);//если побочные знаки имеются, вызвать метод принт для стринг и выйти на начало цикла
                    b = true;
                    break;
                }
            }
Docktor91
т.е. по вашему, дабл это только положительные?
Victor34
Да нет, вы правы, отрицательные тоже. Решил таки, благодаря подсказке.
DanMan
У меня все работает, но тест не проходит. Неужели нельзя юзать регулярные выражения?
public class Solution
{
    public static void main(String[] args) throws IOException
    {
        Pattern doublePattern = Pattern.compile("\\d+\\.\\d+");
        Matcher doubleMatcher = null;
        Pattern integerPattern = Pattern.compile("-?\\d+");
        Matcher integerMatcher = null;
        String str = null;
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true)
        {
            str = reader.readLine();
            if (str.equals("exit")) break;
            doubleMatcher = doublePattern.matcher(str);
            if (doubleMatcher.matches())
                print(Double.parseDouble(str));
            else
            {
                integerMatcher = integerPattern.matcher(str);
                if (integerMatcher.matches())
                {
                    int i = Integer.parseInt(str);
                    if (i > 0 && i < 128)
                        print((short) i);
                    else print(i);
                } else print(str);

            }

        }

    }

    public static void print(Double value)
    {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value)
    {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value)
    {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value)
    {
        System.out.println("Это тип Integer, значение " + value);
    }
nevsky007
  • nevsky007
  • 0
  • Комментарий отредактирован 2016-08-10 14:11:36 пользователем nevsky007
Долго мучился над заданием. Читал советы на форуме касательно выставления дополнительных условий для определения типов введенных с консоли значений. Определил следующее:
1. Для валидации программы достаточно выполнить ЛИШЬ ТЕ УСЛОВИЯ, которые описаны в задании (в ответах на форуме советуют определить дополнительные условия).
2. Порядок проверки условий в цикле имеет значение (что меня очень удивило). То есть сначала надо проверять String и Double, потом остальное. Если наоборот, то компилятор выдает ошибку.
Вопрос: Почему?
<code>while(true)
        {
            String i = reader.readLine();
            try
            {
                if (!i.equals("exit"))
                {
                    if (i.contains("."))
                    {
                        print(Double.valueOf(i));
                    } else if (Integer.parseInt(i) > 0 && Integer.parseInt(i) < 128)
                    {
                        print(Short.valueOf(i));
                    } else if (Integer.parseInt(i) >= 128)
                    {
                        print(Integer.valueOf(i));
                    } else
                        print(i);</code>
exorcistikus
Уже два дня пытаюсь решить задачу разными способами остановился на регулярных выражениях работает правильно без ошибок но проверку не проходит. Вопрос почему?
package com.javarush.test.level15.lesson12.home01;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Разные методы для разных типов
1. Считать с консоли данные, пока не введено слово "exit".
2. Для каждого значения, кроме "exit", вызвать метод print. Если значение:
2.1. содержит точку '.', то вызвать метод print для Double;
2.2. больше нуля, но меньше 128, то вызвать метод print для short;
2.3. больше либо равно 128, то вызвать метод print для Integer;
2.4. иначе, вызвать метод print для String.
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            String s = reader.readLine();
            if ("exit".equals(s)) break;
            if (isNumber(s)){
                int i = Integer.parseInt(s);
                if (i > 0 && i < 128) print(Short.parseShort(s));
                else if (i >= 128) print(Integer.parseInt(s));
            }
            else if (isNumberDoble(s)) print(Double.parseDouble(s));
            else print(s);
        }
        reader.close();
        //напиште тут ваш код
    }

    public static boolean isNumber(String s){
        if (s == null) return false;
        return s.matches("^[0-9]+$");
    }

    public static boolean isNumberDoble(String s){
        if (s == null) return false;
        return s.matches("^[0-9.]+$");
    }


    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
xgrothx
Подскажите, почему нельзя привести класс обертку Integer к примитиву short?
thinker
  • thinker
  • 0
  • Комментарий отредактирован 2017-02-24 18:05:24 пользователем thinker
Та поправьте же валидатор!!!
public class Solution {
    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(System.in);
        ArrayList<String> list = new ArrayList<>();
        while (true) {
            String str = scanner.nextLine();
            if (str.equals("exit")) break;
            list.add(str);
        }
        //  List<String> list = Arrays.asList("2.5", "34643", "  _..", "-впщшоук", "-34", "1111k", "-111p", "128", "-4343");

        for (String x : list) {

            if (x.matches("^\\d*\\.\\d*$") || x.matches("^-\\d*\\.\\d*$")) {
                print(parseDouble(x));
                continue;
            }// print(Double value)

            if (x.matches("\\d+") && parseInt(x) > 0 && parseInt(x) < 128) {
                print(parseShort(x));
                continue;
            } // print(short value)

            if ((x.matches("^[-]\\d*$")) || (x.matches("^\\d*$")) && (parseInt(x) >= 128)) {
                print(parseInt(x));
            } else print(x); // print(String value)
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }

}
thinker
  • thinker
  • 0
  • Комментарий отредактирован 2017-02-24 18:35:50 пользователем thinker
у меня не проходит int и String
тесты показывают, что всё ок

Передавал Integer вместо int — не принимает!!!
==============
Всё, догнал.
Не было проверки, когда 0.
Позор мне :(
TakeYourCrime
Валидатор ругается на «Во всех остальных случаях должен быть вызван метод print(String value).», но идея подсвечивает Print(String value);, то есть он используется, на сколько я понимаю.

public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        BufferedReader reader = new BufferedReader (new InputStreamReader(System.in));
        String key;
        while (!(key = reader.readLine()).equals("exit")) {
            try {
                if (key.contains(".")) { print(Double.parseDouble(key)); }
                else if (Integer.parseInt(key) > 0 && Integer.parseInt(key) < 128){ print(Short.parseShort(key)); }
                else if (Integer.parseInt(key) <= 0 || Integer.parseInt(key) >=128){ print(Integer.parseInt(key)); }
                else { print(reader.readLine()); }
            }
            catch (NumberFormatException e) {}
        }
    }

    public static void print(Double value) {
        System.out.println("Это тип Double, значение " + value);
    }

    public static void print(String value) {
        System.out.println("Это тип String, значение " + value);
    }

    public static void print(short value) {
        System.out.println("Это тип short, значение " + value);
    }

    public static void print(Integer value) {
        System.out.println("Это тип Integer, значение " + value);
    }
}
TakeYourCrime
жаль, что нельзя при помощи коллекций решать :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.