Смотритель: hubert
  • ,

task01.task0134 - не проходит на корректном решении

public static long getVolume(final int a, final int b, final int c) {
        return 1000 * a * b * c;
    }

Решение выше принимается как верное, но если результат перемножения больше int — ответ получается не правильный.
public static long getVolume(final int a, final int b, final int c) {
        return 1000L * a * b * c;
    }

А это решение не принимается.

P.S.: проблема была актуальна на момент конца февраля.
  • ,

com.javarush.task.task19.task1918 - Все сделано простыми базовыми функциями

НЕ проходит валидацию :( что его беспокоит?

Все сделано простыми базовыми функциями (без Map, Stack и даже массивов), решение за один проход, вложенность тегов «ЗА» общим тегом решена рекурсией.

На мой взгляд все очень компактно и складно.

public static void getOuter(String html, String tag) {

int startPosition = 0;
int openTags = 0;
int firstOpenTag = 0;
int secondOpenTag = 0;
int secondCloseTag = 0;

while (html.indexOf(tag, startPosition) > 0) {
int pos = html.indexOf(tag, startPosition);
if ("<".equals(html.substring(pos — 1, pos))) {
++openTags;
if (openTags == 1)
firstOpenTag = pos;
else if (openTags == 2)
secondOpenTag = pos;
}
if ("/".equals(html.substring(pos — 1, pos))) {
if (openTags == 2)
secondCloseTag = pos;
--openTags;
}
startPosition = pos + 1;

if (openTags == 0) {
System.out.println(html.substring(firstOpenTag — 1, startPosition + tag.length()));
if ((secondCloseTag — secondOpenTag) != 0) {
getOuter(html.substring(secondOpenTag — 1, secondCloseTag + tag.length() + 1), tag);
secondOpenTag = secondCloseTag = 0;
}
}
}
}
  • ,

task35.task3513 задание 12 (игра 2048)

Приветствую. Не получается правильно реализовать функцию сэйва и вследствие этого функцию «отмена последнего действия».
Вот условие этого уровня + предыдущего:


2048 (12)

Ну что, попробуем наш алгоритм в действии? Осталось добавить сохранение игрового состояния в начало каждого метода движения, а также еще один кейс для обработки клавиши, которой будем выполнять отмену последнего хода. При сохранении текущего состояния в стек, обрати внимание на то, чтобы всегда сохранялось актуальное состояние и только однажды. Если ты послушал мой совет и реализовал методы right, up, down с помощью поворотов и вызова метода left, можешь использовать следующий подход:

В самом начале методов right, up, down вызываем метод saveState с gameTiles в качестве параметра.

В методе left организуем проверку того, вызывался ли уже метод saveState. За это у нас отвечает флаг isSaveNeeded, соответственно, если он равен true, выполняем сохранение. После выполнения сдвига влево устанавливаем флаг isSaveNeeded равным true. Также добавим в метод keyPressed класса Controller вызов метода rollback по нажатию на клавишу Z (код — KeyEvent.VK_Z).

2048 (11) Отличная работа! На этом этапе у нас уже есть полнофункциональное приложение, но ведь нет предела совершенству, давай еще поработаем. Если ты успел какое-то время поиграть в 2048, то заметил, что порой очень хочется иметь возможность отменить последний ход. Давай создадим в классе Model два стека, в одном будем хранить предыдущие состояния игрового поля, а в другом предыдущие счета. Назовем их previousStates и previousScores. Инициализировать можешь прямо в строке объявления или в конструкторе. Используй стандартную реализацию стека (java.util.Stack). Добавим boolean поле isSaveNeeded = true, оно нам понадобится в будущем.

Хранилище состояний у нас есть, теперь реализуем два метода для работы с ними.

Приватный метод saveState с одним параметром типа Tile[][] будет сохранять текущее игровое состояние и счет в стеки с помощью метода push и устанавливать флаг isSaveNeeded равным false.

Публичный метод rollback будет устанавливать текущее игровое состояние равным последнему находящемуся в стеках с помощью метода pop. Обрати внимание на то, что при сохранении массива gameTiles необходимо создать новый массив и заполнить его новыми объектами типа Tile перед сохранением в стек. В методе rollback достаточно просто выполнить присваивание (gameTiles = previousStates.pop()) и то же для счета, нет необходимости в глубоком копировании. Перед восстановлением игрового состояния с помощью метода rollback не забудь проверить что стеки не пусты, чтобы избежать возникновения исключения EmptyStackException.


Вот мой код.
public class Model {
    private static final int FIELD_WIDTH = 4;
    private Tile[][] gameTiles;
    int score,maxTile;
    private boolean isSaveNeeded = true;
    private Stack<Tile[][]> previousStates=new Stack<>();
    private Stack<Integer> previousScores=new Stack<>();



    public Model() {

        resetGameTiles();
    }
    public boolean canMove() {
        if(!getEmptyTiles().isEmpty())
            return true;
        for(int i = 0; i < gameTiles.length; i++) {
            for(int j = 1; j < gameTiles.length; j++) {
                if(gameTiles[i][j].value == gameTiles[i][j-1].value)
                    return true;
            }
        }
        for(int j = 0; j < gameTiles.length; j++) {
            for(int i = 1; i < gameTiles.length; i++) {
                if(gameTiles[i][j].value == gameTiles[i-1][j].value)
                    return true;
            }
        }
        return false;
    }

    public Tile[][] getGameTiles() {
        return gameTiles;
    }

    private ArrayList<Tile> getEmptyTiles(){
        ArrayList<Tile> emptyTiles=new ArrayList<>();
        for (int m = 0; m < FIELD_WIDTH ; m++) {
            for (int n = 0; n <FIELD_WIDTH ; n++) {
                if(gameTiles[m][n].value==0)emptyTiles.add(gameTiles[m][n]);
            }
        }
        return emptyTiles;
    }
    public void rotateToRight(){
        for (int k=0; k<FIELD_WIDTH/2; k++)
        {
            for (int j=k; j<FIELD_WIDTH-1-k; j++)
            {
                Tile tmp = gameTiles[k][j];
                gameTiles[k][j]  = gameTiles[j][FIELD_WIDTH-1-k];
                gameTiles[j][FIELD_WIDTH-1-k] = gameTiles[FIELD_WIDTH-1-k][FIELD_WIDTH-1-j];
                gameTiles[FIELD_WIDTH-1-k][FIELD_WIDTH-1-j] = gameTiles[FIELD_WIDTH-1-j][k];
                gameTiles[FIELD_WIDTH-1-j][k]  = tmp;
            }
        }

    }
    private void saveState(Tile[][] tiles){
        Tile[][] bufTiles=new Tile[FIELD_WIDTH][FIELD_WIDTH];
        for (int i = 0; i < tiles.length; i++) {
            for (int j = 0; j < tiles[i].length; j++) {
                bufTiles[i][j]=tiles[i][j];
                bufTiles[i][j].value=tiles[i][j].value;
            }
        }
        previousStates.push(bufTiles);
        previousScores.push(this.score);
        isSaveNeeded=false;
    }
    public void rollback(){
        if(!previousScores.isEmpty()&&!previousStates.isEmpty()) {
            gameTiles = previousStates.pop();
            score=previousScores.pop();

        }
    }

    public void right(){
        saveState(this.gameTiles);
        rotateToRight();
        rotateToRight();
        left();
        rotateToRight();
        rotateToRight();
    }
    public void up(){
        saveState(this.gameTiles);
        rotateToRight();
        left();
        rotateToRight();
        rotateToRight();
        rotateToRight();
    }
    public void down(){
        saveState(this.gameTiles);
        rotateToRight();
        rotateToRight();
        rotateToRight();
        left();
        rotateToRight();
    }

    public void left(){
        if(isSaveNeeded)saveState(this.gameTiles);
        boolean isChanged = false;
        for (int i = 0; i < FIELD_WIDTH; i++) {
            if (compressTiles(gameTiles[i]) | mergeTiles(gameTiles[i])) {
                isChanged = true;
            }
        }
        isSaveNeeded=true;
        if (isChanged) addTile();
    }

    private void addTile(){
        ArrayList<Tile> emptyTiles=getEmptyTiles();
        if(!emptyTiles.isEmpty()) {
            Tile randomEmptyTile = emptyTiles.get((int) (emptyTiles.size() * Math.random()));
            randomEmptyTile.value = Math.random() < 0.9 ? 2 : 4;
        }
    }
    private boolean compressTiles(Tile[] tiles){
        boolean isChanged=false;
        for (int i = 1; i < tiles.length; i++) {
            for (int j = 1; j < tiles.length; j++) {
                if (tiles[j - 1].isEmpty() && !tiles[j].isEmpty()) {
                    tiles[j - 1] = tiles[j];
                    tiles[j] = new Tile();
                    isChanged=true;
                }
            }
        }
        return isChanged;
    }
    private boolean mergeTiles(Tile[] tiles){
        boolean isChanged=false;
        for (int i = 1; i < tiles.length; i++) {
            if ((tiles[i - 1].value == tiles[i].value) && !tiles[i - 1].isEmpty() && !tiles[i].isEmpty()) {

                tiles[i - 1].value *= 2;
                if(tiles[i-1].value>maxTile){
                    maxTile = tiles[i-1].value;
                }
                score += tiles[i - 1].value;
                tiles[i] = new Tile();
                isChanged=true;
                compressTiles(tiles);
            }
        }
        return isChanged;
    }


    public void resetGameTiles(){

        gameTiles=new Tile[FIELD_WIDTH][FIELD_WIDTH];
        for (int m = 0; m < FIELD_WIDTH ; m++) {
            for (int n = 0; n <FIELD_WIDTH ; n++) {
                gameTiles[m][n]=new Tile();
            }
        }
        score=0;
        maxTile=2;
        addTile();
        addTile();

    }
}
  • ,

task33.task3310 - Задание 10.

Shortener (10)


Создай и реализуй класс FileStorageStrategy. Он должен:
10.1. Реализовывать интерфейс StorageStrategy.
10.2. Использовать FileBucket в качестве ведер (англ. bucket).
Подсказка: класс должен содержать поле FileBucket[] table.
10.3. Работать аналогично тому, как это делает OurHashMapStorageStrategy, но удваивать количество ведер не когда количество элементов size станет больше какого-то порога, а когда размер одного из ведер (файлов) стал больше bucketSizeLimit.
10.3.1. Добавь в класс поле long bucketSizeLimit.
10.3.2. Проинициализируй его значением по умолчанию, например, 10000 байт.
10.3.3. Добавь сеттер и геттер для этого поля.
10.4. При реализации метода resize(int newCapacity) проследи, чтобы уже не нужные файлы были удалены (вызови метод remove()).
Проверь новую стратегию в методе main(). Учти, что стратегия FileStorageStrategy гораздо более медленная, чем остальные. Не используй большое количество элементов для теста, это может занять оооочень много времени.
Запусти программу и сравни скорость работы всех 3х стратегий.

Требования:
1. Класс FileStorageStrategy должен поддерживать интерфейс StorageStrategy.
2. В классе FileStorageStrategy должны быть созданы все необходимые поля (согласно условию задачи).
3. Методы интерфейса StorageStrategy должны быть реализованы в FileStorageStrategy таким образом, чтобы обеспечивать корректную работу Shortener созданного на его основе.

Последнее требование ни в какую не хочет выполняться.
Да и второе зачлось только когда добавил некое мифическое поле (о котором нигде ни слова кроме как на help.javarush.ru) private long maxBucketSize
Перечитал все вопросы по этой подзадаче тут и на help.javarush.ru. Прошелся поиском по github-у (не нашел ни одного коммита решенной задачи для новой версии).

package com.javarush.task.task33.task3310.strategy;

import java.util.Objects;
import java.util.stream.IntStream;

public class FileStorageStrategy implements StorageStrategy {
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private static final long DEFAULT_BUCKET_SIZE_LIMIT = 10000;
    private FileBucket[] table = new FileBucket[DEFAULT_INITIAL_CAPACITY];

    private long bucketSizeLimit = DEFAULT_BUCKET_SIZE_LIMIT;
    private int size;
    private long maxBucketSize;

    public FileStorageStrategy() {
        for (int i = 0; i < table.length; i++) {
            table[i] = new FileBucket();
        }
    }

    public long getBucketSizeLimit() {
        return bucketSizeLimit;
    }

    public void setBucketSizeLimit(final long bucketSizeLimit) {
        this.bucketSizeLimit = bucketSizeLimit;
    }

    public int getSize() {
        return size;
    }

    public long getMaxBucketSize() {
        return maxBucketSize;
    }

    private int hash(int h) {
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

    private int indexFor(final int hash, final int length) {
        return hash & (length - 1);
    }

    private Entry getEntry(final Long key) {
        final int hash = (key == null) ? 0 : hash(key.hashCode());
        final int index = indexFor(hash, table.length);

        for (Entry e = table[index].getEntry(); e != null; e = e.next) {
            final Long eKey = e.key;
            if (e.hash == hash && Objects.equals(key, eKey))
                return e;
        }
        return null;
    }

    private void resize(final int newCapacity) {
        final FileBucket[] newTable = IntStream
                .range(0, newCapacity)
                .mapToObj(i -> new FileBucket())
                .toArray(FileBucket[]::new);
        transfer(newTable);
        table = newTable;
        maxBucketSize = 0;
        for (final FileBucket bucket : table) {
            final long currentBucketSize = bucket.getFileSize();
            maxBucketSize = currentBucketSize > maxBucketSize ? currentBucketSize : maxBucketSize;
        }
    }

    private void transfer(final FileBucket[] newTable) {
        for (final FileBucket bucket : table) {
            Entry e = bucket.getEntry();
            while (e != null) {
                final Entry next = e.next;
                final int index = indexFor(e.hash, newTable.length);
                e.next = newTable[index].getEntry();
                newTable[index].putEntry(e);
                e = next;
            }
            bucket.remove();
        }
    }

    private void addEntry(final int hash, final Long key, final String value, final int bucketIndex) {
        final Entry e = table[bucketIndex].getEntry();
        table[bucketIndex].putEntry(new Entry(hash, key, value, e));
        size++;

        final long currentBucketSize = table[bucketIndex].getFileSize();
        maxBucketSize = currentBucketSize > maxBucketSize ? currentBucketSize : maxBucketSize;
        if (maxBucketSize > bucketSizeLimit) resize(2 * table.length);
    }

    private void createEntry(final int hash, final Long key, final String value, final int bucketIndex) {
        table[bucketIndex].putEntry(new Entry(hash, key, value, null));
        size++;
        final long currentBucketSize = table[bucketIndex].getFileSize();
        maxBucketSize = currentBucketSize > maxBucketSize ? currentBucketSize : maxBucketSize;
    }

    @Override
    public boolean containsKey(final Long key) {
        return getEntry(key) != null;
    }

    @Override
    public boolean containsValue(final String value) {
        for (final FileBucket bucket : table) {
            for (Entry e = bucket.getEntry(); e != null; e = e.next) {
                if (Objects.equals(e.value, value))
                    return true;
            }
        }
        return false;
    }

    @Override
    public void put(final Long key, final String value) {
        final int hash = (key == null) ? 0 : hash(key.hashCode());
        final int index = indexFor(hash, table.length);

        if (table[index].getEntry() != null) {
            for (Entry e = table[index].getEntry(); e != null; e = e.next) {
                if (e.hash == hash && Objects.equals(e.key, key)) {
                    e.value = value;
                    return;
                }
            }
            addEntry(hash, key, value, index);
        } else {
            createEntry(hash, key, value, index);
        }
    }

    @Override
    public Long getKey(final String value) {
        for (final FileBucket bucket : table) {
            for (Entry e = bucket.getEntry(); e != null; e = e.next) {
                if (Objects.equals(e.value, value))
                    return e.key;
            }
        }
        return null;
    }

    @Override
    public String getValue(final Long key) {
        final Entry e = getEntry(key);
        return e == null ? null : e.value;
    }
}

Java Core, 5 уровень, 12 лекция, Задача: Факториал

День добрый господа.

Описание задачи:
Написать метод, который вычисляет факториал — произведение всех чисел от 1 до введенного числа включая его.
Пример: 4! = factorial(4) = 1*2*3*4 = 24
1. Ввести с консоли число меньше либо равно 150.
2. Реализовать функцию factorial.
3. Если введенное число меньше 0, то вывести 0.
0! = 1

Собственно мой код:

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            int input = Integer.parseInt(reader.readLine());
            reader.close();
            if (input <= 150)
                System.out.println(factorial(input));
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static String factorial(int n) {
        if (n == 0) return "1";
        else if (n < 0) return "0";

        return "" + (n * Integer.parseInt(factorial(n - 1)));
    }
}


Результаты выполнения:
-413
0

0
1

4
24

При отправке задания, прилетают ошибки валидации:
1. Программа должна выводить на экран факториал введенного числа.
2. Метод factorial должен возвращать строковое представление факториала числа переданного ему в качестве параметра.

Ну и мой вопрос — WTF?

UPD 26.04.2017: Вопрос снят. При вводе 150 на выходе имеем 0.

com.javarush.task.task18.task1827 один пункт не проходит проверку


public class Solution {
    private static  int idMax = 0;
    public static void main(String[] args) throws Exception {

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

            List<String> list = new ArrayList<>();

            BufferedReader fileread = new BufferedReader(new FileReader(strfile));
            String fileStr;
            while ((fileStr=fileread.readLine()) != null) {
                list.add(fileStr);
                int id = Integer.parseInt(fileStr.substring(0, 8).trim());
                if (id > idMax) idMax = id;
            }
            fileread.close();

            list.add(StrokaZapisi(args));

            BufferedWriter filewrite = new BufferedWriter(new FileWriter(strfile));
            for (int i=0; i< list.size(); i++) {
                if (i==list.size()-1) filewrite.write(list.get(i));
                else filewrite.write(list.get(i)+"\n");
            }
            filewrite.close();
    }

    static String Space(String stroka, int dlina){

        String space ="";
        int countSpace = dlina - stroka.length();
        for (int i=0; i< countSpace; i++) {
            space = space+" ";
        }
        return stroka = stroka+space;
    }
// формирование строки для записи в файл из аргументов командной строки
    static String StrokaZapisi (String[] args) {
        
        String name="";
        for(int i=1; i < args.length-2;i++) name=name+args[i]+" ";
        name = name.trim();
        if (name.length() > 30) name = name.substring(0, 30); else name = Space(name, 30);

        String price = args[args.length-1].trim();
        if (price.length() > 8) price = price.substring(0, 8); else price = Space(price, 8);

        String quantity = args[args.length-2].trim();
        if (quantity.length() > 4) quantity = quantity.substring(0, 4); else quantity = Space(quantity, 4);

        idMax++;
        String idMaxStr = String.valueOf(idMax);
        if (idMaxStr.length()>8) idMaxStr = idMaxStr.substring(0,8); else idMaxStr = Space(idMaxStr,8);
        String zapis = idMaxStr + name + price + quantity;

        return zapis;

    }
}

Подскажите в чём дело, целый день убит на решение этой задачи, 100500 раз всё переписано и подогнано под требования. Не проходит хоть тресни пункт «Форматирование новой строки товара должно четко совпадать с указанным в задании.» Чего не так не пойму.
Вывод в файле:

19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
123456 Куртка для сноубордистов, разм10173.991234
198479**Майка ростовка 170************12******2.1*
Вставляется последняя строчка, для удобства просмотра вместо пробелов "*". А так пробелу как по заданию.

task21.task2101 обсуждение кода

Уважаемые Java-кодеры!
Несколько дней тому назад, я вложил топик к данной задаче, в надежде получить от Вас
несколько дельных советов по ее решению.
Ваша вежливость не имеет границ, и я понял, что до этого уровня дошли единицы и то которые 
кодят по наитию. Про "сеньоров" с сайта вообще молчу.
Поэтому выкладываю код, прошедший валидацию.
Прошу дать комментарии по поводу его улучшения.
PS. Часть кода удалена, для соблюдения условий сайта. 

package com.javarush.task.task21.task2101;

/* 
Определяем адрес сети
*/
public class Solution {
    public static void main(String[] args) {
        byte[] ip = new byte[]{(byte) 192, (byte) 168, 1, 2};
        byte[] mask = new byte[]{(byte) 255, (byte) 255, (byte) 254, 0};
        byte[] netAddress = getNetAddress(ip, mask);
        print(ip);          //11000000 10101000 00000001 00000010
        print(mask);        //11111111 11111111 11111110 00000000
        print(netAddress);  //11000000 10101000 00000000 00000000

    }

    public static byte[] getNetAddress(byte[] ip, byte[] mask)
    {

        byte[] bytes =new byte[]{(byte) (ip[0]& mask[0]),(byte) (ip[1]& mask[1]),(byte) (ip[2]& mask[2]),(byte) (ip[3]& mask[3])};


        return bytes;
    }

    public static void print(byte[] bytes) {
        String stroka ="";

        for (int i = 0; i < bytes.length;i++)//  извлекаем данные из массива
        {
                String PaketString = Integer.toBinaryString((bytes[i])); // переводим  в бинарное отображение
                                                                            // 2 >>> 10
                                                                            // -64 >>> 11111111111111111111111111111000000
             int rang = 8 - PaketString.length(); // определяем разрядность массива

                if (rang > 0)// условие необходимости дополнить строку до 8 разрядов  прим 10 >>>> 00000010
                {

                    String razrmer = "0";
                    String razrmerPaket = "";


                        for (int j = 0; j < rang; j++)// цикл дополнения разряда "0"
                        {
                            razrmerPaket = razrmerPaket + razrmer;// формирование пустых разрядов
                        }

                    PaketString = razrmerPaket+PaketString;// создание пакета строки в правилином формате

                }
                    if (rang < 0)// проверка на условие лишних разрядов в строке прим 100000010 >>> 00000010
                    {
                      PaketString = PaketString.substring(PaketString.length()-8,PaketString.length()); // удаление значений лишних разрядов

                    }

                    stroka =stroka+" "+ PaketString;// правильной маски формата адресов

        }
       ***********************************// удаление лишнего пробела в 0 разряде строки
        System.out.println(********);

    }
}
  • ,

com.javarush.task.task18.task1825 Работает, не проходит тестирование

Код рабочий, проверял. Пишет, что у меня не выполнено ни одно условие кроме 1-го

package com.javarush.task.task18.task1825;

/* 
Собираем файл
Собираем файл из кусочков.
Считывать с консоли имена файлов.
Каждый файл имеет имя: [someName].partN.
Например, Lion.avi.part1, Lion.avi.part2, …, Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом «end«.
В папке, где находятся все прочтенные файлы, создать файл без суффикса [.partN].
Например, Lion.avi.
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, …, в конце — последнюю.
Закрыть потоки.
Требования:
1. Программа должна считывать имена файлов с консоли, пока не будет введено слово "end".
2. Создай поток для записи в файл без суффикса [.partN] в папке, где находятся все считанные файлы.
3. В новый файл перепиши все байты из файлов-частей *.partN.
4. Чтение и запись должны происходить с использованием буфера.
5. Созданные для файлов потоки должны быть закрыты.
*/
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<File> list = new ArrayList<>();
        while (true) {
            String name = reader.readLine();
            if (!name.equals("end"))
            list.add(new File(name));
            else break;
        }
/*Названия одинаковые, соответственно сортировка листа работает корректно от part1 до partN */
        Collections.sort(list);
        //файл создается в папке с предыдущими файлами
        String resultFile = list.get(0).getAbsolutePath().split(".part")[0] + "";
        File destFile = new File(resultFile);
        destFile.createNewFile();
        FileOutputStream outStream = new FileOutputStream(destFile);
//записывает все буфером
        for (File search : list) {
            FileInputStream inStream = new FileInputStream(search);
            byte[] buffer = new byte[inStream.available()];
            while (inStream.available() > 0) {
                int count = inStream.read(buffer);
                outStream.write(buffer,0,count);
            }
            inStream.close();
        }
        outStream.close();
        reader.close();
    }
}


Ввод:

*C:My programsCodingJavaRushTasks2.JavaCoresrccomjavarushtasktask18task1825avi.part3

C:My programsCodingJavaRushTasks2.JavaCoresrccomjavarushtasktask18task1825avi.part1

C:My programsCodingJavaRushTasks2.JavaCoresrccomjavarushtasktask18task1825avi.part2

end*

Вывод: (создается файл «avi» который содержит инфу 1,2,3 файлов в этой последовательности) «OneTwoThree»
  • ,

task30.task3008 Чат(19)

не могу понять, в чем проблема, все работает как надо, но валидатор не принимает условие «Метод processIncomingMessage должен выводить на экран полученное сообщение message.»

public class BotClient extends Client {

public static void main(String[] args){
BotClient botClient = new BotClient();
botClient.run();
}
@Override
protected String getUserName() {

String botName = «date_bot_» + ((int)(Math.random()*100));
return botName;
}

@Override
protected boolean shouldSendTextFromConsole() {
return false;
}

@Override
protected SocketThread getSocketThread() {
return new BotSocketThread();
}

public class BotSocketThread extends Client.SocketThread{
@Override
protected void clientMainLoop() throws IOException, ClassNotFoundException {
sendTextMessage(«Привет чатику. Я бот. Понимаю команды: дата, день, месяц, год, время, час, минуты, секунды.»);
super.clientMainLoop();
}

@Override
protected void processIncomingMessage(String message) {

ConsoleHelper.writeMessage(message);

String[] messageSplit = message.split(": ");
String result = «Информация для » + messageSplit[0]+ ": ";
Calendar cal = Calendar.getInstance();

switch (messageSplit[1].trim()){
case «дата»:
result += new SimpleDateFormat(«d.MM.YYYY»).format(cal.getTime());
sendTextMessage(result);
break;
case «день»:
result += new SimpleDateFormat(«d»).format(cal.getTime());
sendTextMessage(result);
break;
case «месяц»:
result += new SimpleDateFormat(«MMMM»).format(cal.getTime());
sendTextMessage(result);
break;
case «год»:
result += new SimpleDateFormat(«YYYY»).format(cal.getTime());
sendTextMessage(result);
break;
case «время»:
result += new SimpleDateFormat(«H:mm:ss»).format(cal.getTime());
sendTextMessage(result);
break;
case «час»:
result += new SimpleDateFormat(«H»).format(cal.getTime());
sendTextMessage(result);
break;
case «минуты»:
result += new SimpleDateFormat(«m»).format(cal.getTime());
sendTextMessage(result);
break;
case «секунды»:
result += new SimpleDateFormat(«s»).format(cal.getTime());
sendTextMessage(result);
break;
}

}
}
}

task21.task2101

Помогите разобрать задачу
Задача решается с массивом int тривиально просто, однако создатели усложняют задачу приводя
значения типов int  к значениям типов byte, который в свою очередь имеет значения от -127 до +128
и в связи с этим уходят в отрицательный диапазон.
Можно конечно городить забор из приведения к типам, но валидатор точно это не оценит.
Что делать??
/* 
Определяем адрес сети
*/
public class Solution {
    public static void main(String[] args) {
        byte[] ip = new byte[]{(byte) 192, (byte) 168, 1, 2};
        byte[] mask = new byte[]{(byte) 255, (byte) 255, (byte) 254, 0};
        byte[] netAddress = getNetAddress(ip, mask);
        print(ip);          //11000000 10101000 00000001 00000010
        print(mask);        //11111111 11111111 11111110 00000000
        print(netAddress);  //11000000 10101000 00000000 00000000
    }

    public static byte[] getNetAddress(byte[] ip, byte[] mask) {
        return new byte[4];
    }

    public static void print(byte[] bytes) {
    }
}
  • ,

task36.task3607

Описание класса:
1. Реализует интерфейс Queue.
2. Используется при работе с трэдами.
3. Из этой очереди элементы могут быть взяты только тогда, когда они заэкспарятся, их время задержки истекло.
4. Головой очереди является элемент, который заэкспарился раньше всех.

Мой код — возвращает верное значение в ИДЕЕ, но валидатору что-то не нравится.
Попробовал запустить задачу в браузере — на выходе null.
Возник по ходу вопрос, а как java.util.* работает в браузере, если его нету в classpath?
Буду благодарен за любую подсказку:

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/*
Найти класс по описанию
*/
public class Solution {
    public static void main(final String[] args) {
        System.out.println(getExpectedClass());
    }
    public static Class getExpectedClass() {
        final Set<String> classNames = new HashSet<>();
        final URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        final URL[] jarsPath = classLoader.getURLs();
        //find classes within rt.jar package
        for (final URL jarPath : jarsPath) {
            if (jarPath.toString().endsWith("rt.jar")) {
                try {
                    final JarFile jarFile = new JarFile(jarPath.getPath().toString());
                    final Enumeration<JarEntry> en = jarFile.entries();
                    while (en.hasMoreElements()) {
                        final String fileName = en.nextElement().getName();
                        if (fileName.startsWith("java/util") && fileName.endsWith(".class")) {
                            classNames.add(fileName);
                        }
                    }
                } catch (final IOException ignored) {
                }
            }
        }
        //find class with Queue interface implementation
        for (final String className : classNames) {
            try {
                final String fileName = className.substring(0, className.length() - 6).replace('/', '.');
                final Class cls = Class.forName(fileName);
                if (Queue.class.isAssignableFrom(cls) && cls.getEnclosingClass() == null) {
                    final Field[] fields = cls.getDeclaredFields();
                    final Method[] methods = cls.getDeclaredMethods();
                    if (Arrays.stream(methods)
                            .filter(m -> m.getName().contains("peekExpired"))
                            .flatMap(m -> Arrays.stream(fields))
                            .anyMatch(f -> f.getType().equals(Thread.class))) {
                        return cls;
                    }
                }
            } catch (final ClassNotFoundException ignored) {
            }
        }
        return null;
    }
}
  • ,

package com.javarush.task.task20.task2002; подскажите что не так друзья!

package com.javarush.task.task20.task2002;

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

/* 
Читаем и пишем в файл: JavaRush

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


Требования:
1. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список users пустой.
2. Логика чтения/записи реализованная в методах save/load должна работать корректно в случае, если список users не пустой.
3. Класс Solution.JavaRush не должен поддерживать интерфейс Serializable.
4. Класс Solution.JavaRush должен быть публичным.
5. Класс Solution.JavaRush не должен поддерживать интерфейс Externalizable.
*/
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 = new File("c:\\0\\4.txt");
            OutputStream outputStream = new FileOutputStream(your_file_name);
            InputStream inputStream = new FileInputStream(your_file_name);

            JavaRush javaRush = new JavaRush();

            //формат даты SimpleDateFormat
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

            User ivan = new User();
            ivan.setFirstName("Иванов");
            ivan.setLastName("Иван");
            Date Bdate = new Date();
            Bdate = dateFormat.parse("01/05/1992");

            ivan.setBirthDate(Bdate);
            ivan.setMale(true);
            ivan.setCountry(User.Country.RUSSIA);

            User vasya = new User();
            vasya.setFirstName("Васильев");
            vasya.setLastName("Василий");
            Date bDate = new Date();
            bDate = dateFormat.parse("05/06/1976");
            vasya.setBirthDate(bDate);
            vasya.setMale(true);
            vasya.setCountry(User.Country.UKRAINE);

            javaRush.users.add(ivan);
            javaRush.users.add(vasya);



            //initialize users field for the javaRush object here - инициализируйте поле users для объекта javaRush тут
            javaRush.save(outputStream);

            outputStream.flush();

            JavaRush loadedObject = new JavaRush();
            loadedObject.load(inputStream);
            //check here that javaRush object equals to loadedObject object - проверьте тут, что javaRush и loadedObject равны
            if(javaRush.equals(loadedObject)){
                System.out.println("Загрузка прошла удачно");
            }else{
                System.out.println("Загрузка неудачна");
            }
            outputStream.close();
            inputStream.close();

/*
 //тестовая печать

            for(User u:javaRush.users){
                System.out.println(u.toString());
                System.out.println(u.getFirstName());
                System.out.println(u.getLastName());
                System.out.println(u.getBirthDate());
                System.out.println(u.isMale());
                System.out.println(u.getCountry());


                System.out.println("________________________");
            }

*/
        } 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<>();

        public void save(OutputStream outputStream) throws Exception {
            //implement this method - реализуйте этот метод
            PrintWriter printWriter = new PrintWriter(outputStream);
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            printWriter.println("<newObject>");
            printWriter.println(users.size());
            if(users.size()>0){
                for(User u:users){
                    //printWriter.println(u);
                    printWriter.println(u.getFirstName());
                    printWriter.println(u.getLastName());
                    String sd = dateFormat.format(u.getBirthDate());

                    printWriter.println(sd);
                    printWriter.println(u.isMale());
                    printWriter.println(u.getCountry());
                }
            }

            printWriter.flush();
            printWriter.close();
        }

        public void load(InputStream inputStream) throws Exception {
            //implement this method - реализуйте этот метод
            BufferedReader fileReader = new BufferedReader(new InputStreamReader(inputStream));
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String line;
            while ((line=fileReader.readLine())!=null) {
                if (line.equals("<newObject>")) {


                    int size = Integer.parseInt(fileReader.readLine());
                    for (int i = 0; i < size; i++) {
                        User user = new User();
                        user.setFirstName(fileReader.readLine());
                        user.setLastName(fileReader.readLine());
                        Date bd = new Date();
                        bd = dateFormat.parse(fileReader.readLine());
                        user.setBirthDate(bd);
                        user.setMale(Boolean.parseBoolean(fileReader.readLine()));
                        user.setCountry(User.Country.valueOf(fileReader.readLine()));

                        users.add(user);
                    }
                }


            }






            fileReader.close();
        }

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