level15.lesson12.home09

Программа работает, но не проходит тест. Подскажите в чем bug?
/* Парсер реквестов
Считать с консоли URl ссылку.
Вывести на экран через пробел список всех параметров (Параметры идут после ? и разделяются &, например, lvl=15).
URL содержит минимум 1 параметр.
Если присутствует параметр obj, то передать его значение в нужный метод alert.
alert(double value) - для чисел (дробные числа разделяются точкой)
alert(String value) - для строк

Пример 1
Ввод:
http://javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Вывод:
lvl view name

Пример 2
Ввод:
http://javarush.ru/alpha/index.html?obj=3.14&name=Amigo
Вывод:
obj name
double 3.14
*/

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

public class Solution {
    public static void main(String[] args) throws IOException
    {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        URL url = new URL(r.readLine());
        String s = url.toString();
        String s1 = s.substring(s.indexOf("?")+1);
        if (s1.contains("&"))
        {
            String[] s2 = s1.split("&");
            for (String line : s2)
            {
                if (line.contains("=")&&!line.contains("obj"))
                {
                    String attributeName = line.substring(0, line.indexOf("="));
                    System.out.print(attributeName+" ");
                } else  if (!line.contains("=")&&!line.contains("obj"))
                {
                    System.out.print(line+" ");
                } else {
                    String attributeName = line.substring(0, line.indexOf("="));
                    System.out.print(attributeName+" ");
                }
            }
            System.out.println("");
            if (s1.contains("obj"))
            {
                String value = s1.substring(s1.indexOf("obj=")+4, s1.indexOf("&"));
                if (value.contains("."))
                {
                    try
                    {
                        double d = Double.parseDouble(value);
                        alert(d);
                    }
                    catch (NumberFormatException e)
                    {
                    }
                } else
                    alertS(value);
            }
        } else {
            if (s1.contains("=")&&!s1.contains("obj"))
                System.out.println(s1.substring(0,s1.indexOf("=")));
            else if (s1.contains("=")&&s1.contains("obj"))
            {
                System.out.println(s1.substring(0,s1.indexOf("=")));
                try
                {
                    double value = Double.parseDouble(s1);
                    alert(value);
                }
                catch (NumberFormatException e)
                {
                    alertS(s1);
                }
            }
            else
                System.out.println(s1);
        }

    }
    public static void alert(double value) {
        System.out.println("double " + value);
    }

    public static void alertS(String value) {
        System.out.println("String " + value);
    }
}

level15.lesson12.home09

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

/* Парсер реквестов
Считать с консоли URl ссылку.
Вывести на экран через пробел список всех параметров (Параметры идут после ? и разделяются &, например, lvl=15).
URL содержит минимум 1 параметр.
Если присутствует параметр obj, то передать его значение в нужный метод alert.
alert(double value) - для чисел (дробные числа разделяются точкой)
alert(String value) - для строк

Пример 1
Ввод:
http://javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Вывод:
lvl view name

Пример 2
Ввод:
http://javarush.ru/alpha/index.html?obj=3.14&name=Amigo
Вывод:
obj name
double 3.14
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static void main(String[] args) throws IOException {
        //add your code here
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String s = reader.readLine();
        String URL[] = s.split("\\?");
        String Parametrs[] = URL[1].split("&");
        int d = Parametrs.length;

        HashMap<String, String> map = new HashMap<String, String>();
        for (int i = 0; i < d; i++)
        {
            if (Parametrs[i].contains("="))
            {
                String mass[] = Parametrs[i].split("=");
                map.put(mass[0], mass[1]);
            }
            else map.put(Parametrs[i], "");
        }

        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            System.out.print(key + " ");
        }
        System.out.println();
        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            String value = entry.getValue();
            if (key.equals("obj")) {
                try
                {
                    double a = Double.parseDouble(value);
                    alert(a);
                } catch (Exception e) {
                    alert(value);
                }
            }
        }
    }

    public static void alert(double value) {
        System.out.println("double " + value);
    }

    public static void alert(String value) {
        System.out.println("String " + value);
    }
}


Тестовая строка: javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Выводит: view lvl name
Т.е. почему-то сначала выводит параметры без значения, а потом со значением. Хотя забиваем значения в HashMap по очереди. Не могу раскрыть данную загадку. Помогите разобраться, пожалуйста!

level15.lesson12.home09

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

/* Парсер реквестов
Считать с консоли URl ссылку.
Вывести на экран через пробел список всех параметров (Параметры идут после ? и разделяются &, например, lvl=15).
URL содержит минимум 1 параметр.
Если присутствует параметр obj, то передать его значение в нужный метод alert.
alert(double value) - для чисел (дробные числа разделяются точкой)
alert(String value) - для строк

Пример 1
Ввод:
http://javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Вывод:
lvl view name

Пример 2
Ввод:
http://javarush.ru/alpha/index.html?obj=3.14&name=Amigo
Вывод:
obj name
double 3.14
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static void main(String[] args) throws IOException {
        //add your code here
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String s = reader.readLine();
        String URL[] = s.split("\\?");
        String Parametrs[] = URL[1].split("&");
        int d = Parametrs.length;

        HashMap<String, String> map = new HashMap<String, String>();
        for (int i = 0; i < d; i++)
        {
            if (Parametrs[i].contains("="))
            {
                String mass[] = Parametrs[i].split("=");
                map.put(mass[0], mass[1]);
            }
            else map.put(Parametrs[i], "");
        }

        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            System.out.print(key + " ");
        }
        System.out.println();
        for (Map.Entry<String, String> entry: map.entrySet())
        {
            String key = entry.getKey();
            String value = entry.getValue();
            if (key.equals("obj")) {
                try
                {
                    double a = Double.parseDouble(value);
                    alert(a);
                } catch (Exception e) {
                    alert(value);
                }
            }
        }
    }

    public static void alert(double value) {
        System.out.println("double " + value);
    }

    public static void alert(String value) {
        System.out.println("String " + value);
    }
}


Тестовая строка: javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Выводит: view lvl name
Т.е. почему-то сначала выводит параметры без значения, а потом со значением. Хотя забиваем значения в HashMap по очереди. Не могу раскрыть данную загадку. Помогите разобраться, пожалуйста!
  • ,

level15.lesson12.home01

while (true) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String
}

}
}

подскажите почему не проходит тестирование?
всё работает по условию, вывод:
выакы
Это тип String, значение выакы
5
Это тип short, значение 5
0.36
Это тип Double, значение 0.36
128
Это тип Integer, значение 128
exit

Process finished with exit code 0
  • ,

level15.lesson12.home09 - почему такая проверка на сервере?

/* Парсер реквестов
Считать с консоли URl ссылку.
Вывести на экран через пробел список всех параметров (Параметры идут после? и разделяются &, например, lvl=15).
URL содержит минимум 1 параметр.
Если присутствует параметр obj, то передать его значение в нужный метод alert.
alert(double value) — для чисел (дробные числа разделяются точкой)
alert(String value) — для строк

Пример 1
Ввод:
javarush.ru/alpha/index.html?lvl=15&view&name=Amigo
Вывод:
lvl view name

Пример 2
Ввод:
javarush.ru/alpha/index.html?obj=3.14&name=Amigo
Вывод:
obj name
double 3.14
*/

Задачу решил быстро, должно было принять с 1-го раза, но не принимало почему-то.
Пробовал даже на сложных примерах, типа
javarush.ru/alpha/index.html?lvl=15&??view&&&name=Aobjmigo&obj=3.14&name=&obj=djsdcd&&?oobj=3.0
Начал рыться тут в топиках, случайно нашел, что надо поменять contains() на что-то.

Т.е. вместо такого кода
if (obj.contains(".")) {
                        double doubleVal = Double.parseDouble(obj);
                        alert(doubleVal);
                    } else {
                        alert(obj);
                    }


Такой вот код у меня приняло
try {
                        double doubleVal = Double.parseDouble(obj);
                        alert(doubleVal);
                    } catch (NumberFormatException e) {
                        alert(obj);
                    }


В чем смысл, почему так!?
Может мне кто-то объяснить, особенно составители задач?
Тут есть какой-то смысл или это просто издевательство такое?
  • ,

level15.lesson12.home01 не проходит тестирование.

Задача.

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

Решение

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


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

public class Solution {
    public static void main(String[] args) throws IOException {
        //напиште тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<String> array = new ArrayList<String>();
        String s = reader.readLine();

        while (true)
        {
            array.add(s);
            if (s.equals("exit"))
                break;
            else
                s = reader.readLine();
        }

        for (String st : array)
        {
            if (st.contains("."))
                try
                {
                    print(Double.parseDouble(st));
                    continue;
                } catch (Exception e)
                {
                  print(st);
                  continue;
                }
            else
            try
            {
                int i = Integer.parseInt(st);
                if ( i > 0 && i < 128)
                {
                    print((short)i);
                    continue;
                }
                else
                {
                    print(i);
                    continue;
                }
            } catch (Exception e)
            {
                print(st);
                continue;
            }
        }


    }

    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);
    }
}


Пробовал разные значение, в консоль все выдает корректно, но тест не проходит.

level15.lesson02.task05 Задача засчитана, но не могу осмыслить то что она выводит

Задача засчитана, но не могу осмыслить то что она выводит:
[Большой не содержит кости, Указательный не содержит кости, Средний не содержит кости, Безымянный содержит кости, Мизинец не содержит кости]
[Рука содержит кости, Нога содержит кости, Голова содержит кости, Тело содержит кости]
Yes

Как это так «Большой не содержит кости, Указательный не содержит кости»- у меня вроде там кости есть.:) Так надо? или я что-то неправильно сделал?

level15.lesson12.home04;

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

/* Закрепляем Singleton pattern
1. Найти в гугле пример для - Singleton pattern Lazy initialization.
2. По образу и подобию в отдельных файлах создать три синглтон класса Sun, Moon, Earth.
3. Реализовать интерфейс Planet для классов Sun, Moon, Earth.
4. В статическом блоке класса Solution вызвать метод readKeyFromConsoleAndInitPlanet.
5. Реализовать функционал метода readKeyFromConsoleAndInitPlanet:
5.1. С консоли считать один параметр типа String.
5.2. Если параметр равен одной из констант интерфейса Planet, то создать соответствующий объект и присвоить его Planet thePlanet, иначе обнулить Planet thePlanet.
5.3. Сравнивать введенный параметр можно только с константами из Planet, нельзя создавать свои строки.
*/

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

public class Solution {
    public static Planet thePlanet;

    static
    {
        readKeyFromConsoleAndInitPlanet();
    }

    public static void readKeyFromConsoleAndInitPlanet()
    {

        try
        {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String s = reader.readLine();
            if (s.equals(Planet.EARTH))
                thePlanet = Earth.getInstance();
            else if (s.equals(Planet.MOON))
                thePlanet = Moon.getInstance();
            else if (s.equals(Planet.SUN))
                thePlanet = Sun.getInstance();
            else thePlanet = null;
        } catch (IOException e) {}
    }

}



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

/**
 * Created by SpiritMoon on 15.09.2014.
 */
class Earth implements Planet{
    private static Earth earth;
    private Earth(){}
    public static Earth getInstance(){
        if ( earth == null ){
            earth = new Earth();
        }
        return earth;
    }
}


Господа, я уже просто з! с этой задачей, перепробывал разные реализации класса синглоут и т.д. и т.п., и по 0! Тыкните, пжлст., в чем косяк?

level15.lesson12.home03;

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

import java.math.BigDecimal;

/* ООП - перегрузка
1.В классе Tree перегрузи метод info(Object s) два раза так, чтобы получилось три метода info(Object s),
info(Number s), info(String s).
1.1. Разберись в методе info(Object s). Сделай по аналогии функционал новых методов.
1.2. Например, для метода info(Number s) результат может быть таким "Дерево № 123 , метод Number, параметр Short".
2. В блоке 2 должен вызываться метод info(Object s).
3. В блоке 3 должен вызываться метод info(Number s).
4. В блоке 4 должен вызываться метод info(String s).
*/

public class Solution {
    public static void main(String[] args) {
        // 1 часть 
        new Tree().info(new Integer("4"));
        new Tree().info(new Short("4"));
        new Tree().info(new BigDecimal("4"));
        // 2 часть
        new Tree().info(new Integer("4"));
        new Tree().info(new Short("4"));
        new Tree().info(new BigDecimal("4"));
        // 3 часть
        new Tree().info(new String("4"));
        new Tree().info(new Integer("4").toString());
        new Tree().info(new Short("4").toString());
        new Tree().info(new BigDecimal("4").toString());
    }
}


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

public class Tree {
    public static int globalNumber;
    public int number;

    public Tree() {
        this.number = ++globalNumber;
    }

    public void info(Object s) {
        System.out.println(String.format("Дерево № %d , метод Object, параметр %s", number, s.getClass().getSimpleName()));
    }

    public void info(Number s){
        System.out.println(String.format("Дерево № %d , метод Number, параметр %s", number, s.getClass().getSimpleName()));
    }

    public void info(String s){
        System.out.println(String.format("Дерево № %d , метод String, параметр %s", number, s.getClass().getSimpleName()));
    }
}


Решение прошло, потому что баг, но меня интересует суть решения.Как запустить первую часть с передачей объкта Object?
  • ,

level15.lesson12.home03

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

import java.math.BigDecimal;

/* ООП - перегрузка
1.В классе Tree перегрузи метод info(Object s) два раза так, чтобы получилось три метода info(Object s), info(Number s), info(String s).
1.1. Разберись в методе info(Object s). Сделай по аналогии функционал новых методов.
1.2. Например, для метода info(Number s) результат может быть таким "Дерево № 123 , метод Number, параметр Short".
2. В блоке 2 должен вызываться метод info(Object s).
3. В блоке 3 должен вызываться метод info(Number s).
4. В блоке 4 должен вызываться метод info(String s).
*/

public class Solution {
    public static void main(String[] args) {
        //Блок 2.
        //Вызов для Object (задание 2)
        new Tree().info(new Integer("4"));
        new Tree().info(new Short("4"));
        new Tree().info(new BigDecimal("4"));

        //Блок 3.
        //Вызов для Number (Задание 3)
        new Tree().info(new Integer("4"));
        new Tree().info(new Short("4"));
        new Tree().info(new BigDecimal("4"));

        //Блок 4.
        //Вызов для String (Задание 4)
        new Tree().info(new String("4"));
        new Tree().info(new Integer("4").toString());
        new Tree().info(new Short("4").toString());
        new Tree().info(new BigDecimal("4").toString());
    }
}


Метод info перегрузил — сделал полностью по аналогии с info(Object s). Задание сразу прошло, но при этом в блоках 2 и 3 вызывается info(Number s), что вроде противоречит условию.

level15.lesson12.home02

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

/* Тренировка мозга
Найти логическую ошибку: метод doAction в реализации интерфейса Movable должен выдавать "moving".
Исправьте ошибку, при необходимости измените (отрефакторите) интерфейс Movable.
Результат вывода в консоль должен быть:
flying
moving
*/

public class Solution {
    public static void main(String[] args) {
        Duck duck = new Duck();
        Util.fly(duck);
        Util.move(duck);
    }

    public static class Duck implements Flyable, Movable {
        @Override
        public void doAction() {
            System.out.println("flying");
        }
    }

    public static class Util {
        static void fly(Flyable animal) {
            animal.doAction();
        }

        static void move(Movable animal) {
            animal.doAction();
        }
    }

    public static interface Flyable {
        void doAction();
    }

    public static interface Movable {
        void doAction();
    }
}