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 - почему такая проверка на сервере?

/* Парсер реквестов
Считать с консоли 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);
                    }


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

Как стоило бы закрывать файлы в задаче level18.lesson10.home09?

Условие задачи:

Файлы и исключения
Читайте с консоли имена файлов
Если файла не существует (передано неправильное имя файла), то
перехватить исключение FileNotFoundException, вывести в консоль переданное неправильное имя файла и завершить работу программы.
Закрыть потоки. Не использовать try-with-resources
Не используйте System.exit();

com.javarush.test.level18.lesson10.home09 не проходит после обновления сервера

Первый раз за 18 уровней обращаюсь на форум за помощью. Обычно 95% задач решается с 1-2, ну максимум с третьего раза. Валидатор на отрез отказывается принимать решение. Версия IDEA 14. Плагин тоже обновленный. Пробовал уже перебором найти что я делаю не так с точки зрения валидатора.

Условие задачи:
/* Файлы и исключения
Читайте с консоли имена файлов
Если файла не существует (передано неправильное имя файла), то
перехватить исключение FileNotFoundException, вывести в консоль переданное неправильное имя файла и завершить работу программы.
Закрыть потоки. Не использовать try-with-resources
Не используйте System.exit();
*/


Мой вариант решения номер один:

import java.io.*;

public class Solution
{
    public static void main(String[] args)
    {
        try
        {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String fileName = null;
            FileInputStream flow = null;

            boolean isExit = false;
            while (!isExit)
            {
                try
                {
                    fileName = reader.readLine();
                    flow = new FileInputStream(fileName);

                    flow.close();
                }
                catch (FileNotFoundException e)
                {
                    isExit = true;
                    System.out.println(fileName);
                }
            }

            reader.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}


Последовательность действий в отладчике:
1. Передаем существующий файл (D:/data.txt)
2. Происходит чтение строки из консоли и создание потока
3. Закрываем созданный поток и идем на новую итерацию
4. Предаем имя не существующего файла (D:/blabla.txt)
5. В конструкторе потока
FileInputStream(fileName)
вылетает
FileNotFoundException
исключение и управление передается в бок
catch
до вызова
flow.close()
. При этом в переменную
flow
ссылка на новый поток не запишется, так как он не был создан, и поэтому его в
catch
закрывать не нужно. То есть если на первой итерации передано не корректное имя, то ни один поток не будет инициализирован и закрывать будет нечего. Программа уйдет выполнять
catch

6. В
catch
все просто.

Я знаю что

flow = new FileInputStream(fileName);
flow.close();


не совсем корректно, но в нашем случае между созданием и закрытием потока нет промежуточных источников исключений.

Возможно дело в том что у меня нет условия выхода типа

fileName = reader.readLine();
if(fileName != null)
{
    flow = new FileInputStream(fileName);
    flow.close();
}
else
{
    isExit = true;
}


Короче помогите разобраться в чем дело. Интерес уже спортивный. Черт с ней со статистикой.
  • ,

level08.lesson11.home09

Помогите пожалуйста, почему задача не проходит тестирование?

/* Работа с датой
1. Реализовать метод isDateOdd(String date) так, чтобы он возвращал true, если количество дней с начала года - нечетное число, иначе false
2. String date передается в формате MAY 1 2013
Пример:
JANUARY 1 2000 = true
JANUARY 2 2020 = false
*/

public class Solution
{
    public static void main(String[] args)
    {
        System.out.println(isDateOdd(""));
    }

    public static boolean isDateOdd(String date)
    {
       Date newYear = new Date();
        newYear.setMonth(0);
        newYear.setDate(1);
        newYear.setYear(2015);
        Date nowDate = new Date();
        long msTimeDistance = nowDate.getTime()-newYear.getTime();
        long msDay = 24*60*60*1000;
        int Day = (int)(msTimeDistance/msDay);
       if(Day%2 !=0){
           return true;
       } else {
           return false;
       }
    }
}
  • ,

Так и не ясно где правда level08.lesson11.home09

Исправте меня, или исправте условие…

/* Работа с датой
1. Реализовать метод isDateOdd(String date) так, чтобы он возвращал true, если количество дней с начала года — нечетное число, иначе false
2. String date передается в формате MAY 1 2013
Пример:
JANUARY 1 2000 = true
JANUARY 2 2020 = false
*/

Моё решение
public class Solution
{
    public static void main(String[] args)
    {
        if (isDateOdd("JANUARY 1 2000")) System.out.println("true");
        else System.out.println("false");
    }

    public static boolean isDateOdd(String date)

    {
        Date inDate = new Date(date);
        int year = inDate.getYear();
        Date yearStartTime = new Date();
        yearStartTime.setHours(0);
        yearStartTime.setMinutes(0);
        yearStartTime.setSeconds(0);
        yearStartTime.setDate(1);
        yearStartTime.setMonth(0);
        yearStartTime.setYear(year);

        System.out.println();

        long distanceTime = (inDate.getTime() - yearStartTime.getTime())/(24*60*60*1000);
        System.out.println(distanceTime%2);

        return distanceTime % 2 == 0? false: true;
    }
}


Программа упорно выдаёт false для обоих случаев из условия, и тем не менее прошла тестирование.
  • ,

Так и не ясно где правда level08.lesson11.home09

Исправте меня, или исправте условие…

/* Работа с датой
1. Реализовать метод isDateOdd(String date) так, чтобы он возвращал true, если количество дней с начала года — нечетное число, иначе false
2. String date передается в формате MAY 1 2013
Пример:
JANUARY 1 2000 = true
JANUARY 2 2020 = false
*/

Моё решение
public class Solution
{
    public static void main(String[] args)
    {
        if (isDateOdd("JANUARY 1 2000")) System.out.println("true");
        else System.out.println("false");
    }

    public static boolean isDateOdd(String date)

    {
        Date inDate = new Date(date);
        int year = inDate.getYear();
        Date yearStartTime = new Date();
        yearStartTime.setHours(0);
        yearStartTime.setMinutes(0);
        yearStartTime.setSeconds(0);
        yearStartTime.setDate(1);
        yearStartTime.setMonth(0);
        yearStartTime.setYear(year);

        System.out.println();

        long distanceTime = (inDate.getTime() - yearStartTime.getTime())/(24*60*60*1000);
        System.out.println(distanceTime%2);

        return distanceTime % 2 == 0? false: true;
    }
}


Программа упорно выдаёт false для обоих случаев из условия, и тем не менее прошла тестирование.
  • ,

level08.lesson11.home09

Работа с датой
1. Реализовать метод isDateOdd(String date) так, чтобы он возвращал true, если количество дней с начала года — нечетное число, иначе false
2. String date передается в формате MAY 1 2013
На всех этапах (там где закоментированный System.out.println()) код выдает верные значения, но при этом задача не проходит проверку.

public class Solution
{
    public static void main(String[] args) throws ParseException
    {
        //isDateOdd("MAY 1 2013");
    }

    public static boolean isDateOdd(String date) throws ParseException
    {
        SimpleDateFormat ft = new SimpleDateFormat("MMM dd yyyy");
        Date newDate = new Date();
        Date yearStartDate = new Date();
        newDate = ft.parse(date);
        yearStartDate = ft.parse(date);

        //System.out.println(newDate);

        yearStartDate.setSeconds(0);
        yearStartDate.setMinutes(0);
        yearStartDate.setHours(0);
        yearStartDate.setDate(1);
        yearStartDate.setMonth(0);

        //System.out.println(yearStartDate);

        long timeDistance = newDate.getTime() - yearStartDate.getTime();
        long msDay = 24 * 60 * 60 * 1000;
        int dayCount = (int) (timeDistance/msDay);

        //System.out.println(dayCount);

        if (dayCount % 2 != 0){
            //System.out.println("true");
            return true;
        }else{
            //System.out.println("false");
            return false;
        }
    }
}
  • ,

level08.lesson11.home09

возвращает результат согласно условию, но не засчитывается. может кто сталкивался?
public class Solution
{
public static void main(String[] args) throws ParseException
{
Date da = new Date();

SimpleDateFormat format = new SimpleDateFormat(«MMM dd yyyy», Locale.US);
String dateTime = format.format(da).toUpperCase();
isDateOdd(dateTime);
}

public static boolean isDateOdd(String date) throws ParseException
{
Date yearStartTime = new Date();
yearStartTime.setHours(0);
yearStartTime.setMinutes(0);
yearStartTime.setSeconds(0);
yearStartTime.setDate(1);
yearStartTime.setMonth(0);

SimpleDateFormat format = new SimpleDateFormat(«MMM dd yyyy»,Locale.US);
Date dq = format.parse(date);
long maTimeDistance = dq.getTime() — yearStartTime.getTime();

long msDay = 24 * 60 * 60 * 1000;

int dayCount = (int) (maTimeDistance / msDay);

if (dayCount % 2 == 0)
{
return false;
}
return true;
}
}