• 0.00

  • 0.00

  • ,

коварный валидатор не пропускает задачу "Проход по дереву файлов" task31.task3101

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

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.

Требования:

1. Файл, который приходит вторым параметром в main, должен быть переименован в allFilesContent.txt.

2. Нужно создать поток для записи в переименованный файл.

3. Пройдись по всем файлам в директории, которая приходит первым параметром в main, и всех ее поддиректориях. Файлы с размером более 50 байт нужно удалить используя метод FileUtils.deleteFile.

4. Содержимое всех файлов, размер которых не превышает 50 байт, должно быть записано в файл allFilesContent.txt в отсортированном по имени файла порядке.

5. Поток для записи в файл нужно закрыть.

вот мое решение:

package com.javarush.task.task31.task3101;

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/*
Проход по дереву файлов
*/
public class Solution {
    public static List<File> smallFiles = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        File path = new File(args[0]);
        File resultFileAbsolutePath = new File(args[1]);
        File newFile;
        if(resultFileAbsolutePath.getParent()==null){
            newFile = new File("allFilesContent.txt");
        }else newFile = new File(resultFileAbsolutePath.getParent() + "\\allFilesContent.txt");

        FileUtils.renameFile(resultFileAbsolutePath, newFile);

        FileOutputStream fileOutputStream = new FileOutputStream(newFile);

        checkDir(path);

        Collections.sort(smallFiles, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        for(File files:smallFiles){
            FileInputStream fileInputStream = new FileInputStream(files);
            while (fileInputStream.available() > 0){
                fileOutputStream.write(fileInputStream.read());
            }
            fileOutputStream.write('\n');
            fileOutputStream.flush();
            fileInputStream.close();
        }

        fileOutputStream.close();
    }

    public static void checkDir(File file){
        for(File fileList:file.listFiles()){
            if(fileList.isDirectory())checkDir(fileList);
            if(fileList.isFile()){

                if(fileList.length() > 50){
                    FileUtils.deleteFile(fileList);
                }else {
                    smallFiles.add(fileList);
                }
            }
        }
    }

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


валидатору все нравится, кроме пункта: «Поток для записи в файл нужно закрыть.» почему он так считает я не понимаю!
вдобавок, уже меня смущает тот факт, что, в моем случае, содержимое всех файлов записывается в одну строку, хотя после записи каждого тела файла я вставляю строку

fileOutputStream.write('\n');


кто может объяснить, где я ошибаюсь?
  • ,

task18.task1824 не пойму, что хочет валидатор!


Файлы и исключения

Читайте с консоли имена файлов.

Если файла не существует (передано неправильное имя файла), то перехватить исключение FileNotFoundException, вывести в консоль переданное неправильное имя файла и завершить работу программы.

Закрыть потоки.

Не используйте System.exit();


вот мой код


package com.javarush.task.task18.task1824;

/* 
Файлы и исключения
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        FileInputStream fileInputStream = null;
        while (true){
            String fileName = null;
            try {
                fileName = bufferedReader.readLine();
                fileInputStream = new FileInputStream(fileName);
            }catch (FileNotFoundException e){
                System.out.println(fileName);
                break;
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            fileInputStream.close();
            bufferedReader.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}


валидатор ругается по двум пунктам:
— Если файл не существует, программа должна перехватывать исключение FileNotFoundException.
— Потоки для чтения из файла должны быть закрыты.

я в упор не вижу ошибку… хэлп ми!
  • ,

task18.task1814 нужна подсказка

кто может подсказать, как можно обработать fileName (имеет ли расширение .txt) в конструкторе класса TxtInputStream? ведь первой строкой в нем должен вызываться super(fileName) и не получается перед его вызовом проверить расширение файла…


UnsupportedFileName

Измени класс TxtInputStream так, чтобы он работал только с txt-файлами (*.txt).

Например, first.txt или name.1.part3.txt.

Если передан не txt-файл, например, file.txt.exe, то конструктор должен выбрасывать исключение UnsupportedFileNameException.

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



public class UnsupportedFileNameException extends Exception {
}



package com.javarush.task.task18.task1814;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/* 
UnsupportedFileName
*/

public class TxtInputStream extends FileInputStream {
    
    public TxtInputStream(String fileName) throws FileNotFoundException {
        
    }

    public static void main(String[] args) {
    }
}
  • ,

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


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

неизвестная ошибка при проверке!

уважаемые джаварашевцы!
кто-нибудь знает, что за «неизвестная ошибка при работе с сервером» вылетает при отправке задания на проверку? именно такая ошибка у меня сейчас не позволяет проверить задание!
  • ,

level16.lesson05.task03 "политики" разговаривают бесконечно долго

/* Продвижение на политических дебатах
1. Разберитесь, что делает программа.
2. Нужно сделать так, чтобы Иванов сказал больше всего речей на политических дебатах.
3. Подумай, какой метод можно вызвать у объекта ivanov, чтобы Иванов разговаривал, пока не завершится всё свободное время.
*/

public class Solution {
    public static int totalCountSpeeches = 200;
    public static int soundsInOneSpeech = 1000000;

    public static void main(String[] args) throws InterruptedException {
        Politic ivanov = new Politic("Иванов");
        Politic petrov = new Politic("Петров");
        Politic sidorov = new Politic("Сидоров");

        while (ivanov.getCountSpeaches() + petrov.getCountSpeaches() + sidorov.getCountSpeaches() < totalCountSpeeches) {
        }

        System.out.println(ivanov);
        System.out.println(petrov);
        System.out.println(sidorov);
    }

    public static class Politic extends Thread {
        private int countSounds;

        public Politic(String name) {
            super(name);
            start();
        }

        public void run() {
            while (countSounds < totalCountSpeeches * soundsInOneSpeech) {
                countSounds++;
            }
        }

        public int getCountSpeaches() {
            return countSounds / soundsInOneSpeech;
        }

        @Override
        public String toString() {
            return String.format("%s сказал речь %d раз", getName(), getCountSpeaches());
        }
    }
}


если запустить выполнение этой программы, не вызвав метод join() ни у одного из «политиков», то выполнение программы «зависнет» на не понятно долгое время.
при этом, если в цикл while() вставить тело, в моем случае это выглядит так
while (ivanov.getCountSpeaches() + petrov.getCountSpeaches() + sidorov.getCountSpeaches() < totalCountSpeeches) {
            System.out.println("Иванов " + ivanov.getCountSpeaches());
            System.out.println("Петров " + petrov.getCountSpeaches());
            System.out.println("Сидоров " + sidorov.getCountSpeaches());
        }

то программа отработает, будет выводиться тело цикла и какой-то конечный результат.
но, если при всем при этом, добавить вызов метода join(), то программа отработает, уже не выводя тело цикла, а выдавая сразу результат!
господа-товарищи, кто-то может объяснить, почему так происходит?
  • ,

level16.lesson05.task02

господа, кто может пролить луч света знания и объяснить — для чего в этом методе
public void run() {
            String s = "";
            for (int i = 0; i < 1001; i++) {   //delay
                s += new String("" + i);
                if (i == 1000) {
                    s = " has finished the race!";
                    System.out.println(getName() + s);
                    isFinished = true;
                }
            }
        }

эта строка?
s += new String("" + i);

что с ней, что без нее метод работает.
  • ,

level16.lesson05.task02

господа, кто может пролить луч света знания и объяснить — для чего в этом методе
public void run() {
            String s = "";
            for (int i = 0; i < 1001; i++) {   //delay
                s += new String("" + i);
                if (i == 1000) {
                    s = " has finished the race!";
                    System.out.println(getName() + s);
                    isFinished = true;
                }
            }
        }

эта строка?
s += new String("" + i);

что с ней, что без нее метод работает.
  • ,

в задаче level14.lesson08.home10 не понятно, что конкретно требуется. У кого прошло тестирование, можете помочь?

/* Исправить 4 ошибки
Исправить 4 ошибки в конструкторе NotIncapsulatedClass и отрефактори код
1. В класе NotIncapsulatedClass создать private методы initList(List<Number> list), printListValues, processCastedObjects.
2. Метод initList должен заполнять значениями входящий параметр list:
- найди нужный блок кода в конструкторе, в котором list заполняется значениями
- перенеси его в метод initList
- верни заполненный list.
3. Метод printListValues должен принимать параметр list и вывести в консоль все элементы из списка list:
- метод ничего не возвращает
- найди нужный блок кода в конструкторе, в котором в цикле из списка list выводятся в консоль все значения
- перенеси его в метод printListValues
- исправь 2 ошибки в этом методе.
4. Метод processCastedObjects:
- входящий параметр метода имеет тип List<Number> list
- метод ничего не возвращает
- найди нужный блок кода в конструкторе, в котором в цикле для каждого объекта из списка list проверяется его тип
- перенеси этот блок в метод processCastedObjects
- исправь 2 ошибки в этом методе
- учти, что для объекта типа Float нужно вывести "Is float value defined? " + [Float_object].isNaN()
- учти, что для объекта типа Double нужно вывести "Is double value infinite? " + [Double_object].isInfinite().
*/


методы создал, ошибки исправил, блоки кода из конструктора в методы перенес. код компилируется, но проверку не проходит.
что делать с созданными методами? надо ли их засовывать в конструктор?
  • ,

level10.lesson11.home05 не проходит проверку. кто может помочь и объяснить в чем причина?

кто подскажет, что я не учел?
package com.javarush.test.level10.lesson11.home05;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Количество букв
Ввести с клавиатуры 10 строчек и подсчитать в них количество различных букв (для 33 букв алфавита).  Вывести результат на экран.
Пример вывода:
а 5
б 8
в 3
г 7
д 0
…
я 9
*/

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

        //алфавит
        String abc = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
        char[] abcArray = abc.toCharArray();

        ArrayList<Character> alphabet = new ArrayList<Character>();
        for (int i = 0; i < abcArray.length; i++)
        {
            alphabet.add(abcArray[i]);
        }

        //ввод строк
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++)
        {
            String s = reader.readLine();
            list.add(s.toLowerCase());
        }

        List<Integer>[] arrayList = new ArrayList[33];
        for(int i = 0; i < 33; i++){
            arrayList[i] = new ArrayList<>();
        }

        for (String listElement:list) {
            char[] charArray = listElement.toCharArray();
            for (int i = 0; i < charArray.length; i++){
                if(charArray[i] < '\u0430' || charArray[i] > '\u044F') continue;
                arrayList[alphabet.indexOf(charArray[i])].add(alphabet.indexOf(charArray[i]));
            }
        }

        for (int i = 0; i < arrayList.length; i++){
            System.out.println(alphabet.get(i) +" "+ arrayList[i].size());
        }
    }

}
  • ,

level10.lesson11.home05 не проходит проверку. кто может помочь и объяснить в чем причина?

package com.javarush.test.level10.lesson11.home05;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Количество букв
Ввести с клавиатуры 10 строчек и подсчитать в них количество различных букв (для 33 букв алфавита). Вывести результат на экран.
Пример вывода:
а 5
б 8
в 3
г 7
д 0

я 9
*/

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

//алфавит
String abc = «абвгдеёжзийклмнопрстуфхцчшщъыьэюя»;
char[] abcArray = abc.toCharArray();

ArrayListalphabet = new ArrayList();
for (int i = 0; i < abcArray.length; i++)
{
alphabet.add(abcArray[i]);
}

//ввод строк
ArrayListlist = new ArrayList();
for (int i = 0; i < 10; i++)
{
String s = reader.readLine();
list.add(s.toLowerCase());
}

List[] arrayList = new ArrayList[33];
for(int i = 0; i < 33; i++){
arrayList[i] = new ArrayList<>();
}

for (String listElement:list) {
char[] charArray = listElement.toCharArray();
for (int i = 0; i < charArray.length; i++){
if(charArray[i] < '\u0430' || charArray[i] > '\u044F') continue;
arrayList[alphabet.indexOf(charArray[i])].add(alphabet.indexOf(charArray[i]));
}
}

for (int i = 0; i < arrayList.length; i++){
System.out.println(alphabet.get(i) +" "+ arrayList[i].size());
}
}

}
  • ,

level10.lesson11.home05 не проходит проверку. кто может помочь и объяснить в чем причина?

<blockquote><blockquote>package com.javarush.test.level10.lesson11.home05;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Количество букв
Ввести с клавиатуры 10 строчек и подсчитать в них количество различных букв (для 33 букв алфавита).  Вывести результат на экран.
Пример вывода:
а 5
б 8
в 3
г 7
д 0
…
я 9
*/

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

        //алфавит
        String abc = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
        char[] abcArray = abc.toCharArray();

        ArrayList<Character> alphabet = new ArrayList<Character>();
        for (int i = 0; i < abcArray.length; i++)
        {
            alphabet.add(abcArray[i]);
        }

        //ввод строк
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 10; i++)
        {
            String s = reader.readLine();
            list.add(s.toLowerCase());
        }

        List<Integer>[] arrayList = new ArrayList[33];
        for(int i = 0; i < 33; i++){
            arrayList[i] = new ArrayList<>();
        }

        for (String listElement:list) {
            char[] charArray = listElement.toCharArray();
            for (int i = 0; i < charArray.length; i++){
                if(charArray[i] < '\u0430' || charArray[i] > '\u044F') continue;
                arrayList[alphabet.indexOf(charArray[i])].add(alphabet.indexOf(charArray[i]));
            }
        }

        for (int i = 0; i < arrayList.length; i++){
            System.out.println(alphabet.get(i) +" "+ arrayList[i].size());
        }
    }

}</blockquote><blockquote></blockquote></blockquote>