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

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

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

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

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

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

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

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

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

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

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

task32.task3210 или очередная бяка валидатора.

Уже невозможно просто бороться с валидатором, но может я всё-таки где-то не прав?
Условие:
Используем RandomAccessFile

В метод main приходят три параметра:
1) fileName — путь к файлу;
2) number — число, позиция в файле;
3) text — текст.

Считать текст с файла начиная с позиции number, длинной такой же как и длинна переданного текста в третьем параметре.

Если считанный текст такой же как и text, то записать в конец файла строку ‘true‘, иначе записать ‘false‘.
Используй RandomAccessFile и его методы seek(long pos), read(byte b[], int off, int len), write(byte b[]).
Используй convertByteToString(byte readBytes[]) для конвертации считанной строчки в текст
.

Вот мой код:
public class Solution {
public static void main(String... args) throws IOException {
    RandomAccessFile file=new RandomAccessFile(args[0],"rw");
    int n=Integer.parseInt(args[1]);
    file.seek(n);
    String text=args[2];
    byte[] fileText=new byte[(int)file.length()];
    file.read(fileText,0,text.length());
    file.seek(file.length());
    String shoudBeWritten="";
    if(convertByteToString(fileText).equals(text))shoudBeWritten="true";
    else if(!convertByteToString(fileText).equals(text))shoudBeWritten="false";
    file.writeChars(shoudBeWritten);
    file.close();
}
private static String convertByteToString(byte readBytes[]){
    return String.valueOf(readBytes);
}
}

task21.task2104

Задача решена!!! 
Хочу уточнить пару возникших вопросов.
1) Почему при создании нового объекта Solution вызывается метод hashCode()?
   Хотя фактически нет указаний на его вызов.
2) Мы вызываем метод contains(), а исполняется метод equals() ?



public class Solution {
    private final String first, last;

    public Solution(String first, String last) {
        this.first = first;
        this.last = last;
    }

    @Override
    public boolean equals(Object o) {
          *************
            }

    @Override
    public int hashCode() {
        ***************
    }

    public static void main(String[] args) {
        Set<Solution> s = new HashSet<>();
        s.add(new Solution("Donaldadd", "Duckfff"));
        System.out.println(s.contains(new Solution("Donald", "Duck")));
    }
}
  • ,

Помогите сделать JavaRush еще лучше!

Друзья! По результатам опросов и комментариям на сайте мы поняли, что стоит заняться улучшением читабельности текста. Решили начать с белой темы сайта. Сделали более 30 разных вариантов шрифтов и оттенков. Из них отобрали 4 лучших. Теперь хотим услышать ваше мнение =)

Скажите, какой вариант вам нравится больше всего и почему выбрали именно этот вариант.

Текущий вариант — invis.io/GCBG653B7#/230723334_Lato
Вариант 4 — invis.io/GCBG653B7#/230721738_4
Вариант 10 — invis.io/GCBG653B7#/230721899_10
Вариант 12 — invis.io/GCBG653B7#/230721201_12
Вариант 13 — invis.io/GCBG653B7#/230721024_13
  • ,

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»