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

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

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

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

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

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

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

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

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

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

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

task.task08.task0812 Помогите, пожалуйста.

package com.javarush.task.task08.task0812;

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

/*
Cамая длинная последовательность
Cамая длинная последовательность
1. Создай список чисел.
2. Добавь в список 10 чисел с клавиатуры.
3. Вывести на экран длину самой длинной последовательности повторяющихся чисел в списке.

Пример для списка 2, 4, 4, 4, 8, 8, 9, 12, 12, 14:
3

Искомое значение равно 3, т.к. самая длинная последовательность повторяющихся чисел состоит из трех четверок.
*/

public class Solution {
public static void main(String[] args) throws IOException {
ArrayList list = new ArrayList<>();
int count = 1;
int max = 1;
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 10; i++) {
int a = Integer.parseInt(bf.readLine());
list.add(a);
if (list.get(i).equals(i — 1))
count++;
else count = 1;
}
if (count > max)
max = count;
System.out.println(max);
}
}

task29.task2909 Рефакторинг (13) HELP не проходит

Доброго дня. Помогите плиз, уже устал от этих танцев с бубном. Вроде всё как надо, а тестирование не проходит.

Разберись с кодом пакета user (пользователь).
13.1. Извлечение метода. Добавь метод printInfo(), который будет выводить имя и фамилию
в консоль в формате
Имя: Вася
Фамилия: Пупкин
Замени повторяющийся код метода printUsers() его вызовом.
13.2. Встраивание метода. Избавься от метода ageLessThan16().
13.3. Перемещение метода. Перемести методы printInfo() и printAdditionalInfo() в класс User.
13.4. Расщепление переменной. Переменная age в методе calculateAverageAge() используется для разных промежуточных значений. Перепиши метод без использования этой переменной.
13.5. Удаление присваиваний параметрам. Перепиши метод calculateRate(), чтобы он не
пытался менять входные параметры, а просто возвращал рассчитанное значение.

package com.javarush.task.task29.task2909.user;

import java.util.concurrent.atomic.AtomicInteger;

public class UserHelper {
    private User userAnya = new User("Аня", "Смирнова", 10);
    private User userRoma = new User("Рома", "Виноградов", 30);

    private boolean isManAnya = false;
    private boolean isManRoma = true;

    public void printUsers() {
        userAnya.printInfo();
        userAnya.printAdditionalInfo();
        userRoma.printInfo();
        userRoma.printAdditionalInfo();
    }

    public int calculateAverageAge() {
        User userUra = new User("Юра", "Карп", 28);

        return (userAnya.getAge() + userRoma.getAge() + userUra.getAge()) / 3;
    }

    public int calculateRate(AtomicInteger base, int age, boolean hasWork, boolean hasHouse) {
        AtomicInteger calc = new AtomicInteger();

        calc.set(base.get() + age / 100);
        calc.set((int) (calc.get() * (hasWork ? 1.1 : 0.9)));
        calc.set((int) (calc.get() * (hasHouse ? 1.1 : 0.9)));

        return calc.get();
    }

    public String getBossName(User user) {
        Work work = user.getWork();
        return work.getBoss();
    }
}


package com.javarush.task.task29.task2909.user;

public class User {
    private String name;
    private String surname;
    private int age;

    private String country;
    private String city;
    private House house;

    private Work work;

    public User(String name, String surname, int age) {
        this.name = name;
        this.surname = surname;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getAddress() {
        return country + " " + city + " " + house.house;
    }

    public Work getWork() {
        return work;
    }

    public void setWork(Work work) {
        this.work = work;
    }

    public void printInfo() {
        System.out.println("Имя: " + getName());
        System.out.println("Фамилия: " + getSurname());
    }

    public void printAdditionalInfo() {
        if (getAge() < 16)
            System.out.println("Пользователь моложе 16 лет");
        else
            System.out.println("Пользователь старше 16 лет");
    }
}


На выходе:



Подкиньте кто-нибудь идею. А то шаманство какое-то.
  • ,

level15.lesson12.home01

Подскажите пожалуйста, программа работает в Idea, а в валидаторе пишет: «Программа работала слишком долго и была закрыта!»

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

1. Считать с консоли данные, пока не введено слово «exit«.

2. Для каждого значения, кроме «exit«, вызвать метод print. Если значение:

2.1. содержит точку ‘.‘, то вызвать метод print для Double;

2.2. больше нуля, но меньше 128, то вызвать метод print для short;

2.3. больше нуля или больше либо равно 128, то вызвать метод print для Integer;

2.4. иначе, вызвать метод print для String.


package com.javarush.task.task15.task1519;

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

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

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

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = reader.readLine();
        while(!str.equals("exit"))
        {
            try {

                if (str.toLowerCase().contains(".".toLowerCase())) {
                    print(Double.parseDouble(str));
                    str = reader.readLine();
                } else if (Integer.parseInt(str) < 128 && Integer.parseInt(str) > 0) {
                    print(Short.parseShort(str));
                    str = reader.readLine();
                } else if (Integer.parseInt(str) >= 128 && Integer.parseInt(str) > 0) {
                    print(Integer.parseInt(str));
                    str = reader.readLine();
                }
            }

            catch (NumberFormatException e)
            {
                print(str);
                str = reader.readLine();}
        }

        reader.close();
    }

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

  • ,

Чат (21) Не могу сам додуматься, почему так и как вообще подключиться к какому-то серверу?

Ребят, всем привет. Прохожу большую задачу «Чат», и на 21 подуровне наткнулся на вопрос, который выделен жирным.
5. Переопредели методы в классе ClientGuiController:

а) SocketThread getSocketThread() – должен создавать и возвращать объект типа GuiSocketThread.

б) void run() – должен получать объект SocketThread через метод getSocketThread() и вызывать у него метод run().Разберись, почему нет необходимости вызывать метод run в отдельном потоке, как мы это делали для консольного клиента.
И вот думал-думал, но никак до чего-то стоящего не додумался. Кто уже проходил и знает, почему так? Я конечно уже несколько задач назад сбился с понимания отдельных моментов того, что происходит, но всё же понимаю общую картину и не секу, почему не вызываем отдельный трэд. Хотелось бы разобраться.
Заранее спасибо за ответ.

P.S. Закончил уже задачу, всё прошёл.Но теперь возник вопрос, к какому серверу вообще можно подключиться? Или его можно как-то создать?

level18.lesson03.task04

Либо я туплю, либо валидатор, кидающий на сообщение «Программа не компилируется на сервере». Лично у меня всё отлично компилируется. Какие будут идеи?


package com.javarush.test.level18.lesson03.task04;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import static com.javarush.test.level06.lesson11.bonus01.Solution.max;

/* Самые редкие байты
Ввести с консоли имя файла
Найти байт или байты с минимальным количеством повторов
Вывести их на экран через пробел
Закрыть поток ввода-вывода
*/

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

        FileInputStream inputStream = new FileInputStream(filename);

        int[] frequency = new int[256];

        while (inputStream.available() > 0)
        {
            frequency[inputStream.read()]++;
        }

        int max = 0;

        for (int i = 0; i < 256; i++)
        {
            if (frequency[i] > max) max = frequency[i];
        }

        int min = max;

        for (int i = 0; i < 256; i++)
        {
            if (frequency[i] < min && frequency[i] > 0) min = frequency[i];
        }

        for (int i = 0; i < 256; i++)
        {
            if (frequency[i] == min) System.out.print(i + " ");
        }

        bufferedReader.close();
        inputStream.close();
    }
}
  • ,

task.task19.task1922. Достало. Просто нереально.

Ищем нужные строки
Считать с консоли имя файла.
Вывести в консоль все строки из файла, которые содержат всего 2 слова из списка words.
Закрыть потоки.
Пример:
words содержит слова А, Б, В
Строки:


  • В Б А Д //3 слова из words, не подходит
  • Д А Д //1 слово из words, не подходит
  • Д А Б Д //2 слова — подходит, выводим

Второй день сижу уже на этой задаче. Все уж перепробывал, помогает только один способ — добавить пробел перед первой String. Код ниже берет файл без добавления пробела


public class Solution {
    public static List<String> words = new ArrayList<String>();

    static
    {
        words.add("файл");
        words.add("вид");
        words.add("В");
    }

    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String filename = reader.readLine();
        reader.close();
        BufferedReader fileReader = new BufferedReader(new FileReader(filename));
        ArrayList<String> lel = new ArrayList<>();
        int counter=0;

        String cand;
        String cand1;

        while(fileReader.ready())
        {
            String [] rowdata = fileReader.readLine().split("\\s+");

            for(int i=0; i < rowdata.length; i++)
            {
                cand = rowdata[i];

                for(int j=0; j < words.size(); j++)
                {
                    cand1 = words.get(j);

                    if(cand.equals(cand1))
                    {
                        lel.add(cand);
                        counter++;
                    }
                }
            }
        }

        if(counter==2)
        {
            for(String str : lel)
            {
                System.out.println(str);
            }
        }
        else lel.clear();
        fileReader.close();
    }
}

Они не равны. Почему - не знаю

Это очень интересно, учитывая, что последущие строки проходят проверку без проблем и увеличивают count

После проверки &quot;вид&quot;

Но первая String игнорится, непонятно почему

В итоге, я получаю только «вид» и «В», хотя по идее ничего получать не должен, так как повторений уже 3, что и происходит после добавления пробела.

Ну а теперь самое интересное, я меняю кодировку файла с UTF-8 на ANSI, для того, чтобы считывать латиницу.
и меняю сами слова на английские — все работает так как надо.

В условие заходит, count увеличивает

Бьюсь уже нереально долго. Надеюсь на вашу помощь, спасибо
  • ,

com.javarush.task.task27.task2712 Задания 3

Семь часов сижу, все что можно перечитал, в предыдущим задании сидел три, ошибка была что точку забил поставить ))), помогите, если что то заметите?
Похоже что так спецом делают — принудительная покупка новой подписки.
Пока нервы не сдадут и не купишь))

Ресторан(3)
Сейчас мы можем создавать заказы. Давай сделаем так, чтобы они автоматически поступали к повару.
Есть много различных способов реализации данной функциональности.
Почитай про паттерн Observer — en.wikipedia.org/wiki/Observer_pattern
Он уже реализован в java, и мы его будем использовать.
1. Создадим класс Cook(Повар) в пакете kitchen, он будет готовить. Пусть в конструкторе приходит его имя, которое выводится методом toString.
2. Tablet создает заказы, а Cook их обрабатывает. Расставь правильно Observer и Observable между Tablet и Cook.
3. Метод void update(Observable observable, Object arg), который необходимо реализовать, принимает два параметра.
-observable — объект, который отправил нам значение
-arg — само значение, в нашем случае — это объект Order
На данном этапе мы будем лишь имитировать обработку и выведем в консоль «Start cooking — » + order
3. Пишем main.
Для объекта Observable добавляем свой объект Observer. См. п.2 и описание паттерна в wikipedia
Называем повара, имя не влияет на тесты. В моем варианте — это Amigo :)
Сверим выводы в консоль. Пример моего вывода:
Your order: [Soup] of Tablet{number=5}
Start cooking — Your order: [Soup] of Tablet{number=5}
4. Не забудь сразу после создания заказа и вывода информации о нем в консоль (найдите это место в коде) сделать следующее:
4.1. Установить флаг setChanged()
4.2. Отправить обсерверу заказ — notifyObservers(order);
5. Также внесем небольшое изменение. Сделай так чтобы метод createOrder возвращал текущий заказ или null, если заказ создать не удалось.

Все классы:

Cook

import com.javarush.task.task27.task2712.ConsoleHelper;

import java.util.Observable;
import java.util.Observer;

public class Cook implements Observer {
    private final String name;

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

    @Override
    public String toString() {
        return name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Order order = (Order) arg;
        ConsoleHelper.writeMessage("Start cooking - " + order);
    }
}


Dish
import java.util.Arrays;

public enum Dish {
    Fish, Steak, Soup, Juice, Water;

    public static String allDishesToString(){
        return values().length == 0 ? "" : Arrays.toString(values()).substring(1, Arrays.toString(values()).length() - 1);
    }
}


Order
import com.javarush.task.task27.task2712.ConsoleHelper;
import com.javarush.task.task27.task2712.Tablet;

import java.io.IOException;
import java.util.List;

public class Order {
    private Tablet tablet;
    protected List<Dish> dishes;

    public Order(Tablet tablet) throws IOException {
        this.tablet = tablet;
        this.dishes = ConsoleHelper.getAllDishesForOrder();
    }

    @Override
    public String toString() {
        if (dishes == null || dishes.isEmpty()) {
            return "";
        } else {
            return "Your order: " + dishes.toString() + " of " + tablet.toString();
        }
    }

    public boolean isEmpty() {
        return dishes.isEmpty() || dishes == null;
    }

}


ConsoleHelper
import com.javarush.task.task27.task2712.kitchen.Dish;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class ConsoleHelper {
    private final static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void writeMessage(String message){
        System.out.println(message);
    }

    public static String readString() throws IOException {
        return reader.readLine();
    }

    public static List<Dish> getAllDishesForOrder() throws IOException {
        List<Dish> dishes = new ArrayList<>();
        String str;
        writeMessage("Enter dish...(" + Dish.allDishesToString() + ")");
        while (true) {
            str = readString();
            if ("exit".equals(str)) {
                break;
            }

            try {
                dishes.add(Dish.valueOf(str));
            }
            catch (IllegalArgumentException e) {
                ConsoleHelper.writeMessage(str + " is not detected");
            }
        }
        return dishes;

    }
}


Restaurant
import com.javarush.task.task27.task2712.kitchen.Cook;

public class Restaurant {
    public static void main(String[] args) {
        Cook cook = new Cook("Amigo");
        Tablet tablet = new Tablet(5);
        tablet.addObserver(cook);
        tablet.createOrder();
    }
}


Tablet
import com.javarush.task.task27.task2712.kitchen.Order;
import java.io.IOException;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Tablet extends Observable {
    private final int number;
    final static java.util.logging.Logger logger = Logger.getLogger(Tablet.class.getName());

    public Tablet(int number) {
        this.number = number;
    }

    public void createOrder() {

        try {
            Order order = new Order(this);
            if (order.isEmpty()) return;
            ConsoleHelper.writeMessage(order.toString());
            setChanged();
            notifyObservers(order);

        } catch (IOException ee) {
            logger.log(Level.SEVERE, "Console is unavailable.");
        }
    }

    public int getNumber() {
        return number;
    }

    @Override
    public String toString() {
        return "Tablet{" +
                "number=" + number +
                '}';
    }
}

Задачка 1920 "Самый богатый"

Задачка не проходит. Что может быть?

/* Самый богатый

В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя значение
String.

Для каждого имени посчитать сумму всех его значений.
Вывести в консоль имена в алфавитном порядке, у которых максимальная сумма.
Имена разделять пробелом либо выводить с новой строки.
Закрыть потоки.

Пример входного файла:
Петров 0.501
Иванов 1.35
Петров 0.85

Пример вывода:
Петров

Валидатор задачу не пропускает, пишет:
Программа должна выводить в консоль имена, у которых максимальная сумма.

Может дело в кодировке файла, вот подметил такую вещь:
На файлах в кодировке UTF-8 без BOM все отрабатавает как надо.
Но если сделать кодировку UTF-8 (c BOM), то визуально, у одинаковых строк — будет разный hashcode.
А так как сравнение у map построено на хэш коде, появляются дупликаты в map. И может быть валидатор проверяет данные на основе своего файла в этой кодировке (c BOM) и — поэтому не проходит…
Но чтобы проверить это — лучше читать в байтах, а валидатор ругается если применить не FileReader. Вот ведь…

Тестовый файл:
Петров 0.85
Петров 0.85
Петров 0.6332
Петров 0.6332
Петров 0.6332
Иванов 1.35
Сидоров 1.2
Эльман 3.5995999999999997
Сидоров 0.85

Вывод:
Петров
Эльман
*/


package com.javarush.task.task19.task1920;
import java.io.*;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) throws IOException {
        TreeMap<String, Double> map = new TreeMap<>();
        BufferedReader fileReader = new BufferedReader(new FileReader(args[0]));

        double max = 0;
        while (fileReader.ready()) {
            String s = fileReader.readLine();
            String[] strs = s.split(" ");
            String key = strs[0];
            double value = Double.parseDouble(strs[1]);
            max = value;
            if (map.containsKey(key)) {
                map.put(key, map.get(strs[0]) + value);
            } else
                map.put(key, value);
        }
        fileReader.close();

        //Max
        for (Double a : map.values())
            if (max < a)
                max = a;

        //show
        for (Map.Entry<String, Double> pair : map.entrySet())
            if (pair.getValue() == max)
                System.out.print(pair.getKey()+" ");
    }
}

package com.javarush.task.task08.task0820;

В IDE очень часто такая беда, из-за это не компилируется код (в дженериках отсылает к объектам других задач, как отключить это?), что это такое?


На всякий случай, публикую код, я не понимаю, что с ним не так…

public class Solution {
    public static void main(String[] args) {
        Set<Cat> cats = createCats();
        Set<Dog> dogs = createDogs();

        Set<Object> pets = join(cats, dogs);
        printPets(pets);

        removeCats(pets, cats);
        printPets(pets);
    }

    public static Set<Cat> createCats() {
        HashSet<Cat> result = new HashSet<Cat>();
        //напишите тут ваш код
        result.add(new Cat());
        result.add(new Cat());
        result.add(new Cat());
        result.add(new Cat());

        return result;
    }


    public static Set<Dog> createDogs() {
        //напишите тут ваш код
        HashSet<Dog> dogs = new HashSet<Dog>();
        dogs.add(new Dog());
        dogs.add(new Dog());
        dogs.add(new Dog());

        return dogs;
    }

    public static Set<Object> join(Set<Cat> cats, Set<Dog> dogs) {
        Set<Object> pets = new HashSet<Object>();
        //напишите тут ваш код
        pets.add(dogs);
        pets.add(cats);
        return pets;
    }

    public static void removeCats(Set<Object> pets, Set<Cat> cats) {
        //напишите тут ваш код
        pets.removeAll(cats);
        }

    public static void printPets(Set<Object> pets) {
        //напишите тут ваш код
        for (Object s : pets) {
            System.out.println(s);

        }

        //напишите тут ваш код
        public static class Cat {

        }

        public static class Dog {

        }
    }
}
  • ,

обновление в ide показывает ошибки подчеркнутые красной волнистой линией

Здравствуйте.
Почему у меня новое обновление плагина с переходом на 2,0 в ide. показывает ошибки подчеркнутые красной волнистой линией, которых нет.
например вот эту строку из task23.task2312:
public enum SnakeDirection { 
}

я понять не мог в итоге просто нажал сдать задание и да все приняло.
Подскажите как это исправить?
  • ,

task21.task2113 Ипподром(11)

Валидатор не принимает нивкакую… :(

package com.javarush.task.task21.task2113;

import java.util.ArrayList;
import java.util.List;

public class Hippodrome {
    private List<Horse> horses;
    static Hippodrome game;

    public static void main(String[] args) {
        game = new Hippodrome(new ArrayList<Horse>());
        Horse flame = new Horse("Flame", 3, 0);
        Horse water = new Horse("Water", 3, 0);
        Horse earth = new Horse("Earth", 3, 0);
        game.horses.add(flame);
        game.horses.add(water);
        game.horses.add(earth);
        game.run();

    }

    public Hippodrome(List<Horse> horses) {
        this.horses = horses;
    }

    public List<Horse> getHorses() {
        return horses;
    }

    public void run() {
        for(int i = 0; i < 100; i++) {
            move();
            try {
                Thread.sleep(200);
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }
            print();
        }
    }

    public void move() {
        for(int i = 0; i < horses.size(); i++) {
            horses.get(i).move();
        }
    }

    public void print() {
        for(int i = 0; i < horses.size(); i++) {
            horses.get(i).print();
        }
        for(int i = 0; i < 10; i++) {
            System.out.println();
        }
    }
}