Добро пожаловать

Ресурс, посвященный проекту JavaRush.

ПО всем вопросам можно писать на support{собака}javarush.ru.

Обсуждение задач
UPD: Вся активность этого блога переехала на help.javarush.ru. Все вопросы по задачам задавайте там.
Перед тем, как создавать топик или комментарий, прочитайте это.

Обсуждение лекций — тут находятся топики с дополнительной информацией по каждой лекции из курса. Новые топики в этом блоге создавать нельзя. В комментариях к лекциям можно обсуждать сами лекции (и добавлять полезные ссылки по соответствующей теме).

Отзывы — не проходите мимо. Тут вы можете оставить свои отзывы о проекте JavaRush.

Помощь по IntelliJ Idea — тут размещены разнообразные подсказки, видео и ссылки по работе с лучшей IDE для работы с Java.

ЧАВО — самые часто задаваемые вопросы и ответы на них.

План учебного курса — подробный план по уровням курса JavaRush. Тут вы можете узнать, чему именно вы сможете обучиться, какие навыки приобрести.

Инструкции по работе с JavaRush — тут вы узнаете, как правильно пользоваться обучающим курсом, как эффективнее учиться, как правильно задавать вопросы или искать самим на них ответы…

P.S. Еще создана тема для формирования вопросов для Faq по проекту. Присоединяйтесь к формированию вопросов.
  • ,

com.javarush.task.task18.task1813

package com.javarush.task.task18.task1813;

import java.io.*;

/* 
AmigoOutputStream
*/

public class AmigoOutputStream extends FileOutputStream {
    public static String fileName = "D:/tmp/result.txt";
    private FileOutputStream original = null;


    public AmigoOutputStream(FileOutputStream fileOutputStream) throws Exception {
        super(fileOutputStream.getFD());
        this.original = fileOutputStream;
    }

    @Override
    public void write(int b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        original.write(b, off, len);
    }

    @Override
    public void close() throws IOException {
        original.flush();
        original.write("JavaRush © All rights reserved.".getBytes());
        original.close();
    }

    @Override
    public void flush() throws IOException {
        original.flush();
    }

    public static void main(String[] args) throws Exception {
        new AmigoOutputStream(new FileOutputStream(fileName));
    }

}

Вот такое решение получилось. После того как валидатор принял его, решил протестировать.
переписал метод main следующим образом:
AmigoOutputStream amigoOutputStream = new AmigoOutputStream(new FileOutputStream(fileName));
        amigoOutputStream.close();

Открываю выходной файл и вижу там:
JavaRush © All rights reserved.JavaRush © All rights reserved.

Строка записалась два (!) раза. Отладка показала что переопределенный метод close выполняется два раза…

До верного решения додумался сам заменив строку :
super(fileOutputStream.getFD());
на :
super(filename);
но у меня остались вопросы:
Что это за FileDescriptor, который возвращает метод getFD()?
Получается с его помощью нельзя инициализировать FileOutputStream?
И почему при таком вызове конструктора суперкласса метод close выполняется два раза?
  • ,

Вакансия: Front-end Developer для проекта JavaRush!

Ты разговариваешь на HTML? Видишь сны с подключенными CSS? Можешь добавить интерактивности в стройную картину сайтов, используя JavaScript? Занимаешься этим несколько лет на фрилансе или аутсорсинговой компании и хочешь чего-то другого?


У нас есть отличный проект для тебя! Мы — небольшая компания, выпускаем очень классный веб-продукт, и хотим найти специалиста по верстке, который способен сделать его еще лучше!

Мы хотим, чтобы у тебя был:

  • Опыт работы в Frontend: от 2 лет;
  • глубокие знания CSS3, HTML5;
  • опыт работы с адаптивным дизайном;
  • прочные знания JavaScript;
  • Angular 2(4) — начальный уровень;
  • опыт работы с Bootstrap 3/4;
  • знание Git;
  • опыт работы с AJAX.

Будут плюсом:

  • Знания jQuery;
  • опыт работы с Illustrator;
  • умение мыслить креативно и создавать темплиты/дизайн на свое усмотрение.

Твои обязанности:

  • Верстка страниц и шаблонов на сайте Javarush;
  • создание и верстка новых модулей в проекте;
  • верстка landing pages;
  • работа со стилями.

Условия работы:

  • Работа в офисе (удобное расположение офиса — ст.м. Лыбедская);
  • Оплачиваемый отпуск (24 календарных дня) и оплачиваемые больничные;
  • Дружная команда профессионалов;
  • Возможность профессионального и карьерного роста;
  • Офис со всеми удобствами (зона отдыха, библиотека, кухня, бесплатный чай, кофе, фрукты и печенье);
  • Тимбилдинги и корпоративы за счет компании;
  • Возможность иногда работать из дому.

Интересно? Присылай резюме на почту: hr@javarush.ru
  • ,

level15.lesson09.task01

Условие:

В статическом блоке инициализировать labels 5 различными парами ключ-значение.
Требования:
1. В классе Solution должен быть только один метод(main).
2. В классе Solution должно быть объявлено статическое поле labels типа Map.
3. Поле labels должно быть заполнен 5 различными парами ключ-значение в статическом блоке.
4. Метод main должен выводить содержимое labels на экран.

Мой код:

package com.javarush.task.task15.task1514;

import java.util.HashMap;
import java.util.*;

/* 
Статики-1
*/

public class Solution {
    public static Map labels = new HashMap<Double, String>();
    static{
        labels = new HashMap<Double, Integer>();
        labels = new HashMap<Double, Boolean>();
        labels = new HashMap<Double, Byte>();
        labels = new HashMap<Double, Object>();
        labels = new HashMap<Double, Short>();
        labels = new HashMap<Double, Double>();
    }
    public static void main(String[] args) {
        System.out.println(labels);
    }
}
  • ,

Получение доступа к private полям??

Я заметил это решая задачу Stopwatch (Секундомер).
Обратите внимание на метод doStep класса Stopwatch.

package com.javarush.task.task16.task1612;

public class Solution {
    public static volatile boolean isStopped = false;

    public static void main(String[] args) throws InterruptedException {
        Runner ivanov = new Runner("Ivanov", 4);
        Runner petrov = new Runner("Petrov", 2);
        ivanov.start();
        petrov.start();
        Thread.sleep(2000);
        isStopped = true;
        Thread.sleep(1000);
    }

    public static class Stopwatch extends Thread {
        private Runner owner;
        private int stepNumber;

        public Stopwatch(Runner runner) {
            this.owner = runner;
        }

        public void run() {
            try {
                while (!isStopped) {
                    doStep();
                }
            } catch (InterruptedException e) {
            }
        }

        private void doStep() throws InterruptedException {
            stepNumber++;
            Thread.sleep((long)1000 / owner.speed);
            System.out.println(owner.getName() + " делает шаг №" + stepNumber + "!");
        }
    }

    public static class Runner {
        Stopwatch stopwatch;
        private String name;
        private int speed;

        public Runner(String name, int speed) {
            this.name = name;
            this.speed = speed;
            this.stopwatch = new Stopwatch(this);
        }

        public String getName() {
            return name;
        }

        public int getSpeed() {
            return speed;
        }

        public void start() {
            stopwatch.start();
        }
    }
}


А точнее на строку
Thread.sleep((long)1000 / owner.speed);

Этот код компилируется и запускается.
Как это работает?? Почему?? ведь поле speed класса Runner объявлено:
private int speed;

Получается что можно получить доступ к private полям объекта?
Умные люди! Объясните пожалуйста или тыкните носом если ответ очевиден.

task13.task1328

6. Изменить код согласно новой архитектуре и добавить новую логику:

6.1. Сделать класс AbstractRobot абстрактным, вынести логику атаки и защиты из Robot в AbstractRobot.

6.2. Отредактировать класс Robot учитывая AbstractRobot.

6.3. Расширить класс BodyPart новой частью тела BodyPart.CHEST(«грудь«).

6.4. Добавить новую часть тела в реализацию интерфейсов Attackable и Defensable (в классе AbstractRobot).

public final class BodyPart
{
final static BodyPart LEG = new BodyPart(«нога»);
final static BodyPart HEAD = new BodyPart(«голова»);
final static BodyPart ARM = new BodyPart(«рука»);
final static BodyPart CHEST = new BodyPart(«грудь»);

private String bodyPart;

private BodyPart(String bodyPart)
{
this.bodyPart = bodyPart;
}

@Override
public String toString()
{
return this.bodyPart;
}
}

public class Robot extends AbstractRobot
{

private String name;

public Robot(String name)
{
this.name = name;
}

public String getName()
{
return name;
}

}

public abstract class AbstractRobot implements Attackable, Defensable
{
private static int hitCount;

public abstract String getName();

public BodyPart attack()
{
BodyPart attackedBodyPart = null;
hitCount = hitCount + 1;

if (hitCount == 1)
{
attackedBodyPart = BodyPart.ARM;
} else if (hitCount == 2)
{
attackedBodyPart = BodyPart.HEAD;
}
else if (hitCount == 3)
{

attackedBodyPart = BodyPart.LEG;
}
else if (hitCount == 4)
{
hitCount = 0;
attackedBodyPart = BodyPart.CHEST;
}
return attackedBodyPart;
}

public BodyPart defense()
{
BodyPart defencedBodyPart = null;
hitCount = hitCount + 1;

if (hitCount == 1)
{
defencedBodyPart = BodyPart.HEAD;
} else if (hitCount == 2)
{
defencedBodyPart = BodyPart.LEG;
}
else if (hitCount == 3)
{
defencedBodyPart = BodyPart.ARM;
}
else if (hitCount == 4)
{
hitCount = 0;
defencedBodyPart = BodyPart.CHEST;
}
return defencedBodyPart;
}

}

Валидатор говорит, что проблема в логике атаки и защиты. Но я пробовал абсолютно все варианты. Кто знает в чем проблема, буду очень благодарен.

task13.task1326

Сортировка четных чисел из файла
1. Ввести имя файла с консоли.
2. Прочитать из него набор чисел.
3. Вывести на консоль только четные, отсортированные по возрастанию.

Требования:
1. Программа должна считывать данные с консоли.
2. Программа должна вывести на экран все четные числа считанные из файла отсортированные по возрастанию.
3. Программа должна выводить данные на экран.
4. Программа должна закрывать поток чтения из файла(FileInputStream).

И все бы хорошо, если бы не надо было использовать именно FileInputStream

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.io.FileInputStream;
import java.io.InputStream;

public class Solution
{
public static void main(String[] args) throws Exception
{
BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
InputStream fin = new FileInputStream (keyReader.readLine());

keyReader.close();
ArrayListlist = new ArrayList();

///fileReader.read(); // удаляем первый символ

while (fin.available() > 0 ){

int a = fin.read();
if (a % 2 == 0) {
list.add(a);
}
}
Collections.sort(list);
for (Integer i: list) {
System.out.println(i);
}

// напишите тут ваш код c:/temp/txt.txt

fin.close();
}
}

С любым другим классом работает, кроме этого. Что не так?
  • ,

task31.3101 неправильный вывод

Друзья, помогите пожалуйста. Проблема такая, задачу решил, валидатор скушал, но вывод получается неправильный. Понимаю, что-то не так с компаратором, но что именно допереть не могу. Без компаратора читает и пишет из директорий хорошо, но соответственно без сортировки. С сортировкой получается приведенный ниже вывод.Пробовал вынести из try-with-resources — вообще не сортирует. Подскажите что не так, хочется понять.

java.lang.NumberFormatException В плагине JavaRush Task

Добрый день. При выполнении задач JavaRush через плагин для IDEA получаю вот такую ошибку.
Exception in thread «main» java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at com.javarush.task.task10.task1017.Solution.main(Solution.java:17)

Process finished with exit code 1
При этом, если тот же код запустить просто в IDEA (не в плагине) или на сайте, все работает. Буду благодарен за помощь. (Не так давно всё было хорошо и подобных ошибок не вылетало)
На всякий случай код ниже.


package com.javarush.task.task05.task0532;

import java.io.*;

/* 
Задача по алгоритмам
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        int maximum = Integer.MIN_VALUE;
        for (int i = 0; i < N; ++i){
            int temp = Integer.parseInt(reader.readLine());
            if (temp > maximum){
                maximum = temp;
            }

        }


        //напишите тут ваш код

        System.out.println(maximum);
    }
}

task.task18.task1827

Коллеги! Объясните мне тупому почему не принимает валидатор мое решение. Кто решил — скиньте пожалуйста свое решение на vik.piter@gmail.com
Программа все делает правильно… но не принимает!
Уже не могу сидеть на этом задании…

Прайсы


CrUD для таблицы внутри файла.
Считать с консоли имя файла для операций CrUD.

Программа запускается со следующим набором параметров:
-c productName price quantity

Значения параметров:
где id — 8 символов.
productName — название товара, 30 chars (60 bytes).
price — цена, 8 символов.
quantity — количество, 4 символа.

-c — добавляет товар с заданными параметрами в конец файла, генерирует id самостоятельно, инкрементируя максимальный id, найденный в файле.

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity

Данные дополнены пробелами до их длины.

Пример:
19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
19847983 Куртка для сноубордистов, разм10173.991234

Требования:
1. Программа должна считать имя файла для операций CrUD с консоли.
2. При запуске программы без параметров список товаров должен остаться неизменным.
3. При запуске программы с параметрами "-c productName price quantity" в конец файла должна добавится новая строка с товаром.
4. Товар должен иметь следующий id, после максимального, найденного в файле.
5. Форматирование новой строки товара должно четко совпадать с указанным в задании.
6. Созданные для файлов потоки должны быть закрыты.

package com.javarush.task.task18.task1827;

/* 
Прайсы
*/

import java.io.*;
import java.nio.Buffer;
import java.util.ArrayList;

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

        if (args[0].equals("-c") && args.length == 4) {


            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            String fileName = reader.readLine();
            reader.close();

            // получаем параметры для прибавления

            String productName = args[1];
            if (productName.length() > 30) {
                productName = args[1].substring(0, 29);
            } else {
                while ((30 - productName.length()) != 0) {
                    productName += " ";
                }
            }

            String price = args[2];
            if (price.length() > 8) {
                price = args[2].substring(0, 7);
            } else {
                while ((8 - price.length()) != 0) {
                    price += " ";
                }
            }

            String quantity = args[3];
            if (quantity.length() > 4) {
                quantity = args[3].substring(0, 3);
            } else {
                while ((4 - quantity.length()) != 0) {
                    quantity += " ";
                }
            }

            // нашли id который надо прибавить
            FileReader fileReader = new FileReader(fileName);
            StringBuilder sb = new StringBuilder();
            while (fileReader.ready()) {
                sb.append((char) fileReader.read());
            }
            fileReader.close();

            String sub2parse = sb.toString().substring(sb.toString().length() - 50, sb.toString().length() - 42);

            StringBuilder sb2 = new StringBuilder();

            Integer t;
            for (char c : sub2parse.toCharArray()) {
                t = Integer.parseInt(String.valueOf©);
                if (t instanceof Integer) {


                }

                if (c != ' ') {
                    sb2.append©;
                }
            }


            double id = Double.parseDouble(sb2.toString());


            if (id < 99999999) {
                id++;
            }

            // добавили к id нужные пробелы
            String idString = Double.toString(id);
            if (idString.length() < 8) {
                while ((8 - idString.length()) != 0) {
                    idString += " ";
                }
            }

            // генерим нашу выстраданную строчку
            String string = idString + productName + price + quantity;

            // считываем все в массив
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            ArrayList<String> ss = new ArrayList<String>();
            while (br.ready()) {
                ss.add(br.readLine());
            }
            br.close();

            BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
            for (String str : ss) {
                bw.write(str);
            }
            bw.write(string);
            bw.close();


        }
    }
}

Android studio. Подскажите как можно сделать ?

Идея:
Сделать список кнопок, с наименованием мест. При нажатии кнопки должно открываться новое активити.

Проблема:
Как можно сделать кнопку, которая будет добавлять кнопки в layout…

Как я вижу осуществление идеи:
Кнопка «Добавить место» выполняет код:
1. Запросить ввод текстового поля
2. Добавить в HashMap<Button,String> новую кнопку, с заполненными параметрами.
3. Сохранить список в файл на устройстве, чтобы при запуске программы его подгружать.

Нужен совет:
1. Как сделать кнопку, хотя бы ссылку на какую-нибудь реализацию.
2. Может есть более красивый способ добавления мест?

П.С. прошу не пинать, только начал учиться.

task 0824 или самое прекрасное задание. Работает правильно но не проходит проверку

и ко всему прочему, этот код проходит «типа компиляцию» на сервере однако компилируя джава файл через cmd (javac) компилятор ругается на созданный «типа разработчиками» переопределенный метод класса Human, а именно — метод toString()
Так как соответствовать тексту задания КОТОРОЕ ВОЗМОЖНО ПОНЯТЬ ЛИШЬ ИМЕННО ТАК КАК НУЖНО ПОТОМУ ЧТО ВСЕ РАСПИСАНО ИДЕАЛЬНО И ВОПРОСОВ ПО ЗАДАНИЮ СОВЕРШЕННО НЕ ВОЗНИКАЕТ...