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

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

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

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

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

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

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

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

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

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

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

com.javarush.task.task19.task1903

Помогите разобраться, в чём проблема? Работает как надо — вывод как в примере, условия выполнены…

/*
Адаптация нескольких интерфейсов
Адаптируй IncomeData к Customer и Contact.
Классом-адаптером является IncomeDataAdapter.
Инициализируйте countries перед началом выполнения программы. Соответствие кода страны и названия:
UA Ukraine
RU Russia
CA Canada
Дополнить телефонный номер нулями до 10 цифр при необходимости (смотри примеры).
Обратите внимание на формат вывода фамилии и имени человека.
*/


import java.util.HashMap;
import java.util.Map;

public class Solution {
    public static Map < String, String > countries = new HashMap < String, String > ();
    static {
        countries.put("UA", "Ukraine");
        countries.put("RU", "Russia");
        countries.put("CA", "Canada");
    }
    public static void main(String[] args) {
    }

    public static class IncomeDataAdapter implements Customer, Contact {
        private IncomeData data;
        public IncomeDataAdapter(IncomeData data) {
            this.data = data;
        }
        @Override
        public String getCompanyName() {

            return data.getCompany();
        }
        @Override
        public String getCountryName() {

            return countries.get(data.getCountryCode());
        }
        @Override
        public String getName() {
            String lastName = data.getContactLastName();
            String firstName = data.getContactFirstName();
            return lastName + ", " + firstName;
        }
        @Override
        public String getPhoneNumber() {
            String number = String.valueOf(data.getPhoneNumber());
            while (number.length() < 10) {
                number = 0 + number;
            }
            String phone = "+" + String.valueOf(data.getCountryPhoneCode()) + "(" + number.substring(0, 3) + ")" + number.substring(3, 6) + "-" + number.substring(6, 8) + "-" + number.substring(8, 10);
            return phone;
        }
    }
    public static interface IncomeData {
        String getCountryCode(); //example UA
        String getCompany(); //example JavaRush Ltd.
        String getContactFirstName(); //example Ivan
        String getContactLastName(); //example Ivanov
        int getCountryPhoneCode(); //example 38
        int getPhoneNumber(); //example 501234567
    }
    public static interface Customer {
        String getCompanyName(); //example JavaRush Ltd.
        String getCountryName(); //example Ukraine
    }
    public static interface Contact {
        String getName(); //example Ivanov, Ivan
        String getPhoneNumber(); //example +38(050)123-45-67
    }
}


Это main с проверкой:


        IncomeData data = new IncomeData() {
            @Override
            public String getCountryCode() {
                return "UA";
            }

            @Override
            public String getCompany() {
                return "JavaRush Ltd.";
            }
            @Override
            public String getContactFirstName() {
                return "Ivan";
            }
            @Override
            public String getContactLastName() {
                return "Ivanov";
            }
            @Override
            public int getCountryPhoneCode() {
                return 38;
            }
            @Override
            public int getPhoneNumber() {
                return 501234567;
            }
        };
        Contact
        var = new IncomeDataAdapter(data);
        Customer var2 = new IncomeDataAdapter(data);
        System.out.println(var2.getCompanyName());
        System.out.println(var2.getCountryName());
        System.out.println(var.getName());
        System.out.println(var.getPhoneNumber());

com.javarush.task.task19.task1906

/*
Четные байты
Считать с консоли 2 имени файла.
Вывести во второй файл все байты с четным индексом.

Пример:
второй байт, четвертый байт, шестой байт и т.д.

Закрыть потоки ввода-вывода.
*/

package com.javarush.task.task19.task1906;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;

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

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        FileReader fileReader = new FileReader(bufferedReader.readLine());
        FileWriter fileWriter = new FileWriter(bufferedReader.readLine());
        bufferedReader.close();

        int count = 1;

        while (fileReader.ready()){
            if ((count%2)==0){
                fileWriter.write(fileReader.read());
            }
            count++;
        }
        fileReader.close();
        fileWriter.close();
    }
}


Не проходит проверку. Подозреваю, что считывать нужно всё-таки байты, а не символы? Для этого нужно написать адаптер от FileReader к InputStream или как-то по-другому? Какой тогда интерфейс должен реализовывать класс-адаптер, если InputStream это не интерфейс? Или можно унаследоваться от InputStream? Помогите плс, кто шарит. Если что, в задаче обязательно использовать именно FileReader.

task31.task3101 Что же еще нужно, чтобы задача прошла тестирование? Help!

Проход по дереву файлов

1. На вход метода main подаются два параметра.

Первый — path — путь к директории, второй — resultFileAbsolutePath — имя файла, который будет содержать результат.

2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:

2.1. Если у файла длина в байтах больше 50, то удалить его (используй метод FileUtils.deleteFile).

2.2. Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:

2.2.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.

2.2.2. Переименовать resultFileAbsolutePath в ‘allFilesContent.txt‘ (используй метод FileUtils.renameFile).

2.2.3. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 2.2.1. Тела файлов разделять «n«.

Все файлы имеют расширение txt.

package com.javarush.task.task31.task3101;
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.TreeSet;
import java.util.Comparator;


/* 
Проход по дереву файлов
*/
public class Solution {
    public static void main(String[] args) throws IOException{

        TreeSet<SortedFile> set = new TreeSet<>();
        File dir = new File(args[0]);
        Path path = dir.toPath();

        Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
                File file = path.toFile();
                if (file.length() > 50)
                    FileUtils.deleteFile(file);
                else
// добавляю в сэт файловый объект отсортированный по имени файла без учета пути к нему
// для чего создала класс с компаратором
                    set.add(new SortedFile(file));
                return FileVisitResult.CONTINUE;
            }
        });

        FileInputStream fis;
        String resultFileAbsolutePath = args[1];
        File source = new File(resultFileAbsolutePath);
        if (!source.exists())
            source.createNewFile();

        File destination =  new File(source.getParent() + "\\" + "allFilesContent.txt");
        FileUtils.renameFile(source, destination);

        FileOutputStream allFilesContent = new FileOutputStream(destination);

        for (SortedFile f : set)
        {
            fis = new FileInputStream(f.getAbsolutePath());
            while (fis.available() > 0)
                allFilesContent.write(fis.read());
            fis.close();
            allFilesContent.write(System.lineSeparator().getBytes());
        }
        allFilesContent.close();
    }

     public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }

    public static class SortedFile implements Comparable<SortedFile>
    {
        File file;
        public SortedFile(File file)
        {
            this.file = file;
        }

        public String getAbsolutePath ()
        {
            return file.getAbsolutePath();
        }

        @Override
        public int compareTo(SortedFile o) {
            return file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf('\\')).compareTo(o.getAbsolutePath().substring(o.getAbsolutePath().lastIndexOf('\\')));
        }
    }
}
package com.javarush.task.task31.task3101;

        import java.io.File;

public class FileUtils {

    public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }

    public static void renameFile(File source, File destination) {
        if (!source.renameTo(destination)) System.out.println("Can not rename file with name " + source.getName());
    }
}


Задача проверку не проходит.
Рекомендации валидатор выдает следующие:
1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt
2. Нужно создать поток для записи в переименованный файл.
3. Пройдись по всем файлам в директории, которая приходит первым параметром в main, и всех ее поддиректориях. Файлы с размером более 50 байт нужно удалить используя метод FileUtils.deleteFile.
4. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.
5. Поток для записи в файл закрыть.

Все условия соблюдены. Кто решил, помогите, пожалуйста!

task31.task3101 Что же еще нужно, чтобы задача прошла тестирование? Help!

Проход по дереву файлов

1. На вход метода main подаются два параметра.

Первый — path — путь к директории, второй — resultFileAbsolutePath — имя файла, который будет содержать результат.

2. Для каждого файла в директории path и в ее всех вложенных поддиректориях выполнить следующее:

2.1. Если у файла длина в байтах больше 50, то удалить его (используй метод FileUtils.deleteFile).

2.2. Если у файла длина в байтах НЕ больше 50, то для всех таких файлов:

2.2.1. Отсортировать их по имени файла в возрастающем порядке, путь не учитывать при сортировке.

2.2.2. Переименовать resultFileAbsolutePath в ‘allFilesContent.txt‘ (используй метод FileUtils.renameFile).

2.2.3. В allFilesContent.txt последовательно записать содержимое всех файлов из п. 2.2.1. Тела файлов разделять «n«.

Все файлы имеют расширение txt.

package com.javarush.task.task31.task3101;
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.TreeSet;
import java.util.Comparator;


/* 
Проход по дереву файлов
*/
public class Solution {
    public static void main(String[] args) throws IOException{

        TreeSet<SortedFile> set = new TreeSet<>();
        File dir = new File(args[0]);
        Path path = dir.toPath();

        Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
                File file = path.toFile();
                if (file.length() > 50)
                    FileUtils.deleteFile(file);
                else
// добавляю в сэт файловый объект отсортированный по имени файла без учета пути к нему
// для чего создала класс с компаратором
                    set.add(new SortedFile(file));
                return FileVisitResult.CONTINUE;
            }
        });

        FileInputStream fis;
        String resultFileAbsolutePath = args[1];
        File source = new File(resultFileAbsolutePath);
        if (!source.exists())
            source.createNewFile();

        File destination =  new File(source.getParent() + "\\" + "allFilesContent.txt");
        FileUtils.renameFile(source, destination);

        FileOutputStream allFilesContent = new FileOutputStream(destination);

        for (SortedFile f : set)
        {
            fis = new FileInputStream(f.getAbsolutePath());
            while (fis.available() > 0)
                allFilesContent.write(fis.read());
            fis.close();
            allFilesContent.write(System.lineSeparator().getBytes());
        }
        allFilesContent.close();
    }

     public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }

    public static class SortedFile implements Comparable<SortedFile>
    {
        File file;
        public SortedFile(File file)
        {
            this.file = file;
        }

        public String getAbsolutePath ()
        {
            return file.getAbsolutePath();
        }

        @Override
        public int compareTo(SortedFile o) {
            return file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf('\\')).compareTo(o.getAbsolutePath().substring(o.getAbsolutePath().lastIndexOf('\\')));
        }
    }
}
package com.javarush.task.task31.task3101;

        import java.io.File;

public class FileUtils {

    public static void deleteFile(File file) {
        if (!file.delete()) System.out.println("Can not delete file with name " + file.getName());
    }

    public static void renameFile(File source, File destination) {
        if (!source.renameTo(destination)) System.out.println("Can not rename file with name " + source.getName());
    }
}


Задача проверку не проходит.
Рекомендации валидатор выдает следующие:
1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt
2. Нужно создать поток для записи в переименованный файл.
3. Пройдись по всем файлам в директории, которая приходит первым параметром в main, и всех ее поддиректориях. Файлы с размером более 50 байт нужно удалить используя метод FileUtils.deleteFile.
4. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.
5. Поток для записи в файл закрыть.

Все условия соблюдены. Кто решил, помогите, пожалуйста!

Экспериментальная версия плагина (v.2) для IntelliJ IDEA

Друзья, многие из вас (в частности, пользователи операционной системы Mac OS) просили нас улучшить работу плагина для IntelliJ IDEA.

IntelliJ IDEA
Мы активно работаем над этой задачей и уже близки к ее решению.

Сегодня мы подготовили для вас новую экспериментальную версию в которой (скорее всего) исправлены все существующие ошибки.

Просим всех у кого наблюдается падение плагина под Mac OS или Linux попробовать установить экспериментальную версию и посмотреть все ли работает.

Скачать ее вы можете здесь.

Если что-то не так, пожалуйста подробно опишите, что происходит, какая у вас версия ОС, IDEA, по возможности присылайте скришноты. Это поможет нам оперативно воспроизвести ошибку и быстро все исправить.

Спасибо за понимание. Мы стараемся для вас!
  • ,

IDEA 2016 3.4 как изменить внешний вид подсказок?

Здравствуйте. В новой идее переменные в конструкторах ( и не только ) стали выделяться самой программой ( видно на скриншоте ) Скажите пожалуйста — есть ли какая-нибудь возможность управлять внешним видом этих подсказок? (хотелось бы сделать их текст ярче)
Спасибо.

P.S. создать топик в разделе IDEA почему-то не смог, извините.
  • ,

task17.task1720 задача решена, но не понятно, какой был баг?

вот условие и задача


Банкомат

Разберись, как работает программа



Во время тестирования лог содержит следующее:

…..

Добавляем 100, на счету 1100

Добавляем 100, на счету 1200

Тратим 1000, на счету 100

Недостаточно денег

…..



Создан баг:

При списании денег со счета теряются деньги



Найти и исправить ошибку



package com.javarush.task.task17.task1720;

import java.math.BigDecimal;

public class BankAccount {
    private BigDecimal balance;
    private String owner;

    public BankAccount(String owner) {
        this(BigDecimal.ZERO, owner);
    }

    public BankAccount(BigDecimal balance, String owner) {
        this.balance = balance;
        this.owner = owner;
    }

    public void deposit(BigDecimal money) {
        BigDecimal newBalance = balance.add(money);
        System.out.println("Добавляем " + money + ", на счету " + newBalance);
        balance = newBalance;
    }

    public synchronized void withdraw(BigDecimal money) throws NotEnoughMoneyException {
        BigDecimal newBalance = balance.subtract(money);

        if (newBalance.compareTo(BigDecimal.ZERO) < 0) throw new NotEnoughMoneyException();

        balance = newBalance;
        System.out.println("Тратим " + money + ", на счету " + balance);
    }

    public void deposit(String money) {
        deposit(new BigDecimal(money));
    }

    public void withdraw(String money) throws NotEnoughMoneyException {
        withdraw(new BigDecimal(money));
    }
}



package com.javarush.task.task17.task1720;

public class NotEnoughMoneyException extends Exception {
}



package com.javarush.task.task17.task1720;

public class Bankomat {

    static BankAccount account = new BankAccount("Amigo");

    public static volatile boolean isStopped;

    public static void main(String[] args) throws InterruptedException {
        addMoney.start();
        SpendThread spendThread = new SpendThread();
        SpendThread spendThread1 = new SpendThread();
        SpendThread spendThread2 = new SpendThread();
        spendThread.start();
        spendThread1.start();
        spendThread2.start();
        Thread.sleep(4000);
        isStopped = true;
    }

    private static Thread addMoney = new Thread() {
        @Override
        public void run() {
            while (!isStopped) {
                account.deposit("1000");            //кладем на счет
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    };


    public static class SpendThread extends Thread {

        @Override
        public void run() {
            while (!isStopped) {
                try {
                    account.withdraw("100");             //снимаем со счета
                } catch (NotEnoughMoneyException e) {
                    System.out.println("Недостаточно денег");
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    }
}


до и после решения задача выполнялась одинаково. в чем заключается баг, кто подскажет?!

task38.task3801 что не так? (админы, обратите внимание)

Исправь ошибки в коде
Исключения NameIsEmptyException и NameIsNullException должны быть checked.
Все типы исключений должны быть обработаны.
Реализацию методов main() и getNumberOfCharacters() не менять.

public class Solution {
    public static void main(String[] args) {
        if (args.length > 0) {
            try {
                System.out.println("Имя содержит " + NameChecker.getNumberOfCharacters(args[0]) + " символов");
            } catch (Exception e) {
                System.out.println(e.toString());
            } catch (NameIsNullException e) {
                System.out.println("Ошибка: Имя не задано");
            } catch (NameIsEmptyException e) {
                System.out.println("Ошибка: Имя пустое");
            }
        }
    }
}

public class NameChecker {
    private static final int MAX_NUMBER_OF_CHARACTERS = 100500;
    public static int getNumberOfCharacters(String name) throws NameIsEmptyException, NameIsNullException, Exception {
        if (name == null)
            throw new NameIsNullException();
        else if (name.isEmpty())
            throw new NameIsEmptyException();

        int length = name.length();
        if (length > MAX_NUMBER_OF_CHARACTERS)
            throw new Exception("Слишком длинное имя");
        return length;
    }
}

public class NameIsEmptyException extends Throwable {
}

public class NameIsNullException extends Throwable{
}

валидатор выдает непонятные подсказки: если не менять мэйн и метод то кастом исключения д.б. наследниками тровэйбл. и в сигнатуру метода надо добавить эксепшин
в таком виде не принимает. ВСЕ РАБОТАЕТ, что не так??
  • ,

task20.task2002 | level20.lesson02.task02 Не могу до конца понять условие

Здравствуйте, господа форумчане. Долго уже ломаю голову, над тем, как же решить эту задачу. То есть код работает, ошибки не выдает, но не проходит проверку. А дело состоит в том, что я не могу до конца осмыслить, что от меня требует условие, а именно:

Читаем и пишем в файл: JavaRush
Реализуйте логику записи в файл и чтения из файла для класса JavaRush.
В файле your_file_name.tmp может быть несколько объектов JavaRush.
Метод main реализован только для вас и не участвует в тестировании.

То что выделено жирным, для меня загадка. То есть я не понимаю, что под этим подразумевается. Можете обьяснить, что от меня требуется и что меняет данное условие в save/load методах?

Код Solution класса:

package com.javarush.task.task20.task2002;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/* 
Читаем и пишем в файл: JavaRush
*/
public class Solution {
    public static void main(String[] args) {
        //you can find your_file_name.tmp in your TMP directory or fix outputStream/inputStream according to your real file location
        //вы можете найти your_file_name.tmp в папке TMP или исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
        try {
            File your_file_name = File.createTempFile("your_file_name", null);
            OutputStream outputStream = new FileOutputStream("/Users/mac/Documents/JavaRushTasks/2.JavaCore/src/com/javarush/task/task20/task2002/File1");
            InputStream inputStream = new FileInputStream("/Users/mac/Documents/JavaRushTasks/2.JavaCore/src/com/javarush/task/task20/task2002/File1");

            JavaRush javaRush = new JavaRush();
            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            User user = new User();
            user.setFirstName("Vangelis");
            user.setLastName("Kondratevi");
            user.setBirthDate(new Date());
            user.setMale(true);
            user.setCountry(User.Country.UKRAINE);
            javaRush.users.add(user);

            javaRush.save(outputStream);
            outputStream.flush();

            JavaRush javaRush1 = new JavaRush();
            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            User user1 = new User();
            user1.setFirstName("Andrei");
            user1.setLastName("Karpovich");
            user1.setBirthDate(new Date());
            user1.setMale(true);
            user1.setCountry(User.Country.OTHER);
            javaRush1.users.add(user1);

            javaRush1.save(outputStream);
            outputStream.flush();

            JavaRush loadedObject = new JavaRush();
            loadedObject.load(inputStream);
            //check here that javaRush object equals to loadedObject object - проверьте тут, что javaRush и loadedObject равны

            outputStream.close();
            inputStream.close();

        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with my file");
        } catch (Exception e) {
            //e.printStackTrace();
            System.out.println("Oops, something wrong with save/load method");
        }
    }

    public static class JavaRush {
        public List<User> users = new ArrayList<>();
        private static int objCount = 0;

        public void save(OutputStream outputStream) throws Exception {
            //implement this method - реализуйте этот метод
            PrintWriter writer = new PrintWriter(outputStream);
            String areUsersPresent = users != null ? "yes" : "no";
            writer.println(areUsersPresent);
            if(users != null) {
                int size = users.size();
                writer.println(size);
                for (int i = 0; i < size; i++) {
                    User user = users.get(i);
                    String firstName = user.getFirstName();
                    writer.println(firstName);
                    String lastName = user.getLastName();
                    writer.println(lastName);
                    String bd = new SimpleDateFormat("dd-MM-yyyy").format(user.getBirthDate());
                    writer.println(bd);
                    String isMale = user.isMale() ? "yes" : "no";
                    writer.println(isMale);
                    String country = user.getCountry().getDisplayedName();
                    writer.println(country);
                }
            }
            writer.flush();
        }

        public void load(InputStream inputStream) throws Exception {
            //implement this method - реализуйте этот метод
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String areUsersPresent = reader.readLine();
            if(areUsersPresent.equals("yes")){
                int size = Integer.parseInt(reader.readLine());
                if(size>0){
                    for (int i = 0; i < size; i++) {
                        User user = new User();
                        String firstName = reader.readLine();
                        user.setFirstName(firstName);

                        String lastname = reader.readLine();
                        user.setLastName(lastname);

                        Date bd = new SimpleDateFormat("dd-MM-yyyy").parse(reader.readLine());
                        user.setBirthDate(bd);

                        boolean isMale = reader.readLine().equals("yes");
                        user.setMale(isMale);

                        String countryStr = reader.readLine();
                        User.Country country;
                        if(countryStr.equals("Ukraine")){
                            country = User.Country.UKRAINE;
                        } else if(countryStr.equals("Russia")){
                            country = User.Country.RUSSIA;
                        } else {
                            country = User.Country.OTHER;
                        }
                        user.setCountry(country);
                        users.add(user);
                    }
                }
            }
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;

            JavaRush javaRush = (JavaRush) o;

            return users != null ? users.equals(javaRush.users) : javaRush.users == null;

        }

        @Override
        public int hashCode() {
            return users != null ? users.hashCode() : 0;
        }
    }
}


Код User класса:

package com.javarush.task.task20.task2002;

import java.util.Date;

public class User {
    private String firstName;
    private String lastName;
    private Date birthDate;
    private boolean isMale;
    private Country country;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public boolean isMale() {
        return isMale;
    }

    public void setMale(boolean male) {
        isMale = male;
    }

    public Country getCountry() {
        return country;
    }

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

    public static enum Country {
        UKRAINE("Ukraine"),
        RUSSIA("Russia"),
        OTHER("Other");

        private String name;

        private Country(String name) {
            this.name = name;
        }

        public String getDisplayedName() {
            return this.name;
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (isMale != user.isMale) return false;
        if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false;
        if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) return false;
        if (birthDate != null ? !birthDate.equals(user.birthDate) : user.birthDate != null) return false;
        return country == user.country;

    }

    @Override
    public int hashCode() {
        int result = firstName != null ? firstName.hashCode() : 0;
        result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
        result = 31 * result + (birthDate != null ? birthDate.hashCode() : 0);
        result = 31 * result + (isMale ? 1 : 0);
        result = 31 * result + (country != null ? country.hashCode() : 0);
        return result;
    }
}

Ошибка валидатора task25.task2515 Space (12)

В условии требуется создать конструктор с параметрами int, валидатор так не принимает.
Исправил на double — валидатор принял.


Space (12)

Теперь займемся кораблем.

Для сложности сделаем так: если пользователь нажал кнопку влево, то корабль начинает все время двигаться влево.

Если нажал кнопку вправо — все время в право до упора.

Поэтому заведем специальную переменную dx, которая будет хранить направление движения корабля.

если dx = 1, корабль каждый ход идет на 1 вправо,

если dx = -1, корабль каждый ход идет на 1 влево.

Надо:

а) добавь конструктор, можно такой:

Радиус корабля будет равен 3. Корабль большой — это вам не ракета и не бомба.

public SpaceShip(int x, int y)

{

super(x, y, 3);

}


б) добавь в класс SpaceShip переменную dx (double, по умолчанию равна 0);

в) метод moveLeft(), устанавливает dx равной -1;

г) метод moveRight(), устанавливает dx равной 1.

Принятый конструктор:


public SpaceShip(double x, double y) {
        super(x, y, 3);
    }
  • ,

Реализация стратегии.

Судя по записям задач поиска контуров, brainfuck кодирования многим интересна алгоритмика, как одна из сторон программирования.
Предлагаю вам реализовать «мозги» следующей игры.
И если, авторов решения будет несколько, можно устроить «соревнование».

1) Поле игры — матрица 10х10, элементы которой целые числа от 0 до 100 размещены на ней случайным образом.
2) Количество игроков может быть от 2х до 10-ти, но сделаем упрощение — пусть их будет двое.
3) Каждый игрок начинает с суммой очков = 0.
4) Игроки ходят по очереди и выбирают число на матрице. Выбранное игроком число прибавляется к его сумме очков и в матрице игры выбранное число зануляется.
5) Если игрок не выбрал число, то на данном ходу он добавляет к своей сумме ноль и ход переходит к следующему игроку.
6) Игрок может выбрать число на матрице только в строке или колонке выбранного на предыдущем ходе числа.
7) Выбор направления поиска текущего хода- строка или колонка матрицы попеременно:
если предыдуший поиск происходил в строке, то текуший должен происходить в колонке,
и наоборот:
если предыдуший поиск происходил в колонке, то текуший должен происходить в строке.
8) Время поиска хода ограничено.
9) Игра останавливается, если игрок не может выполнить очередной ход (либо все числа матрицы выбраны, либо в процессе игры у текушего игрока нет выбора).
10) Выигрывает игрок, набравший большее количество очков.
11) Для упрощения, первый ход делается в левом верхнем углу (координаты (0,0) матрицы).

Для наглядности, примеры первых ходов:


Я накидал код реализации игры с выдачей результатов на консоль.
Исходники на github.com/maratsr/MatrixGame

Для реализации своего алгоритма необходимо создать реализацию интерфейса IGameStrategy и реализовать в нем:
1) метод getTurn(). Где собственно и происходит поиск оптимального хода
2) метод toString(). Просто вывод информации о вашем методе.
Достаточно:
1) добавить код в getTurn() класса MyGameStrategy, где прописать алгоритм. Весь упор именно на алгоритмику, а не собственно знание Java.
2) добавить его одним из игроков в метод static main класса Game для игры.
Всего то пару десятков строк реализации…

Для облегчения написания собственного алгоритма я привел примеры реализаций (как заготовки):
NonZeroFirstValueGameStrategy — Поиск первого доступного элемента
MaxValueGameStrategy — Поиск максимального значения в строке или колонке
RandomValueGameStrategy — Случайный ход

Для тестирования вашего алгоритма можете посоревноваться с ними. Можете также изменить кол-во игроков, размер начальной матрицы и т.п.

Game — основной класс, реализующий игру:
— Генерирует поле игры.
— Создает игроков с их стратегиями.
— В процессе игры передает ход стратегиям и ограничивает время принятия решения (в случае его превышения, прерывает стратегию).
— Выводит в консоль ход игры и ее результат.

Вариантов реализации прочих стратегий вагон:
Перебор на первые 2,3,4… хода с выбором лучшего («ветви и границы»). Можете по ходу нахождения хода присваивать его аргументу функции move,
процесс перебора программа прервет и в качестве решения возьмет ход, найденный до этого момента.
Подсчет сумм элементов колонок или строк матрицы + поиск с учетом этого…
Можно добавить элементы случайности…
и т.п. и т.д.

P.S. Буду также благодарен, если кто подскажет более правильный способ (чем Executor + Future) для
ограничения времени работы любого метода (который не знает что его время выполнения лимитировано).