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

коварный валидатор не пропускает задачу "Проход по дереву файлов" 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');


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

level31.lesson02.home02

/* Находим все файлы
Реализовать логику метода getFileTree, который должен в директории root найти список всех файлов включая вложенные.
Используйте очередь, рекурсию не используйте.
Верните список всех путей к найденным файлам, путь к директориям возвращать не надо.
Путь должен быть абсолютный.
*/

package com.javarush.test.level31.lesson02.home02;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution
{

    public static void main(String[] args) throws IOException
    {
        List<String> list = getFileTree("C:\\Users\\1\\Downloads\\JavaRushHomeWork\\JavaRushHomeWork\\test");
        for (int i = 0; i < list.size(); i++)
        {
            System.out.println(list.get(i));
        }
    }

    public static List<String> getFileTree(String root) throws IOException
    {
        List<File> allDir = new LinkedList<>();
        List<String> allFiles = new ArrayList<>();
        File file = new File(root);

        for (File entry : file.listFiles()
                )
        {
            if (entry.isFile()) allFiles.add(entry.getAbsolutePath());
            else allDir.add(entry);
        }

        while (!allDir.isEmpty())
        {
            for (File folder : allDir
                    )
            {
                for (File search : folder.listFiles()
                        )
                {
                    if (search.isFile()) allFiles.add(search.getAbsolutePath());
                    else allDir.add(search);
                }
            }
            allDir.remove(0);
        }
        return allFiles;
    }
}


Вывод:
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\1.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\3.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\6.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\7.txt
C:\Users\1\Downloads\JavaRushHomeWork\JavaRushHomeWork\test\123\12333.txt

Перед отправкой на сервер main удаляю. Не принимается. Подскажите, что не так?

level22.lesson09.task03 - ни в какую не принимается!!!

package com.javarush.test.level22.lesson09.task03;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;


/* Составить цепочку слов
В методе main считайте с консоли имя файла, который содержит слова, разделенные пробелом.
В методе getLine используя StringBuilder расставить все слова в таком порядке,
чтобы последняя буква данного слова совпадала с первой буквой следующего не учитывая регистр.
Каждое слово должно участвовать 1 раз.
Метод getLine должен возвращать любой вариант.
Слова разделять пробелом.
В файле не обязательно будет много слов.

Пример тела входного файла:
Киев Нью-Йорк Амстердам Вена Мельбурн

Результат:
Амстердам Мельбурн Нью-Йорк Киев Вена
*/
public class Solution {
    public static void main(String[] args) throws Exception {

        BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        String fileName = consoleReader.readLine();
        consoleReader.close();

        BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
        String[] words = fileReader.readLine().split(" ");
        fileReader.close();

        StringBuilder result = getLine(words);
        System.out.println(result.toString());
    }

    public static StringBuilder getLine(String... words) {
        if (words == null || words.length == 0) return null;
        StringBuilder sb = new StringBuilder();
        for (String s : words) {
            if (!sb.toString().contains(s)) {
                if (sb.toString().isEmpty()) {
                    sb.append(s + " ");
                } else {
                    String sbFirstChar = sb.toString().trim().substring(0, 1);
                    String sbLastChar = sb.toString().trim().substring(sb.toString().trim().length() - 1);
                    String wordFirstChar = s.substring(0, 1);
                    String wordLastChar = s.substring(s.length() - 1);

                    if (sbFirstChar.equalsIgnoreCase(wordLastChar)) {
                        sb.insert(0, s + " ");
                    } else if (sbLastChar.equalsIgnoreCase(wordFirstChar)) {
                        sb.append(s + " ");
                    }
                }
            }
        }
        return sb;
    }
}


Что я упустил??? Проверки сделал, все равно чего-то не хватает компилятору
  • ,

task.task26.task2613 Задание 8

CashMachine (8)

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

1. Перенеси логику из main в DepositCommand и InfoCommand.

Проверим, что там стало с main? Цикл, в котором спрашиваем операцию у пользователя, а потом вызываем метод у CommandExecutor.

И так до бесконечности… надо бы придумать условие выхода из цикла.

Исправь цикл, чтоб он стал do-while. Условие выхода — операция EXIT.

2. Давай запустим прогу и пополним счет на EUR 100 2 и USD 20 6, и посмотрим на INFO.

Ничего не понятно, т.к. создались 2 манипулятора: первый для EUR, второй для USD.

Давай улучшим логику InfoCommand. Надо вывести баланс по каждому манипулятору.

2.1. В классе CurrencyManipulatorFactory создай статический метод getAllCurrencyManipulators(), который вернет Collection всех манипуляторов.

У тебя все манипуляторы хранятся в карте, не так ли? Если нет, то отрефактори.

2.2. В InfoCommand в цикле выведите [код валюты — общая сумма денег для выбранной валюты].

Запустим прогу и пополним счет на EUR 100 2 и USD 20 6, и посмотрим на INFO.

Все работает правильно?

EUR — 200

USD — 120

Отлично!

3. Запустим прогу и сразу первой операцией попросим INFO. Ничего не вывело? Непорядок.

Добавь в манипулятор метод boolean hasMoney(), который будет показывать, добавлены ли какие-то банкноты или нет.

4. В InfoCommand используй метод п.3. и выведите фразу «No money available.«, если нет денег в банкомате.
  • ,

com.javarush.task.task18.task1813

package com.javarush.task.task18.task1813;

import java.io.*;

/* 
AmigoOutputStream
*/

public class AmigoOutputStream extends FileOutputStream {
    public static String fileName = "D:/tmp/result.txt";
    private FileOutputStream original = null;


    public AmigoOutputStream(FileOutputStream fileOutputStream) throws Exception {
        super(fileOutputStream.getFD());
        this.original = fileOutputStream;
    }

    @Override
    public void write(int b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b) throws IOException {
        original.write(b);
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        original.write(b, off, len);
    }

    @Override
    public void close() throws IOException {
        original.flush();
        original.write("JavaRush © All rights reserved.".getBytes());
        original.close();
    }

    @Override
    public void flush() throws IOException {
        original.flush();
    }

    public static void main(String[] args) throws Exception {
        new AmigoOutputStream(new FileOutputStream(fileName));
    }

}

Вот такое решение получилось. После того как валидатор принял его, решил протестировать.
переписал метод main следующим образом:
AmigoOutputStream amigoOutputStream = new AmigoOutputStream(new FileOutputStream(fileName));
        amigoOutputStream.close();

Открываю выходной файл и вижу там:
JavaRush © All rights reserved.JavaRush © All rights reserved.

Строка записалась два (!) раза. Отладка показала что переопределенный метод close выполняется два раза…

До верного решения додумался сам заменив строку :
super(fileOutputStream.getFD());
на :
super(filename);
но у меня остались вопросы:
Что это за FileDescriptor, который возвращает метод getFD()?
Получается с его помощью нельзя инициализировать FileOutputStream?
И почему при таком вызове конструктора суперкласса метод close выполняется два раза?
  • ,

level15.lesson09.task01

Условие:

В статическом блоке инициализировать labels 5 различными парами ключ-значение.
Требования:
1. В классе Solution должен быть только один метод(main).
2. В классе Solution должно быть объявлено статическое поле labels типа Map.
3. Поле labels должно быть заполнен 5 различными парами ключ-значение в статическом блоке.
4. Метод main должен выводить содержимое labels на экран.

Мой код:

package com.javarush.task.task15.task1514;

import java.util.HashMap;
import java.util.*;

/* 
Статики-1
*/

public class Solution {
    public static Map labels = new HashMap<Double, String>();
    static{
        labels = new HashMap<Double, Integer>();
        labels = new HashMap<Double, Boolean>();
        labels = new HashMap<Double, Byte>();
        labels = new HashMap<Double, Object>();
        labels = new HashMap<Double, Short>();
        labels = new HashMap<Double, Double>();
    }
    public static void main(String[] args) {
        System.out.println(labels);
    }
}
  • ,

Получение доступа к private полям??

Я заметил это решая задачу Stopwatch (Секундомер).
Обратите внимание на метод doStep класса Stopwatch.

package com.javarush.task.task16.task1612;

public class Solution {
    public static volatile boolean isStopped = false;

    public static void main(String[] args) throws InterruptedException {
        Runner ivanov = new Runner("Ivanov", 4);
        Runner petrov = new Runner("Petrov", 2);
        ivanov.start();
        petrov.start();
        Thread.sleep(2000);
        isStopped = true;
        Thread.sleep(1000);
    }

    public static class Stopwatch extends Thread {
        private Runner owner;
        private int stepNumber;

        public Stopwatch(Runner runner) {
            this.owner = runner;
        }

        public void run() {
            try {
                while (!isStopped) {
                    doStep();
                }
            } catch (InterruptedException e) {
            }
        }

        private void doStep() throws InterruptedException {
            stepNumber++;
            Thread.sleep((long)1000 / owner.speed);
            System.out.println(owner.getName() + " делает шаг №" + stepNumber + "!");
        }
    }

    public static class Runner {
        Stopwatch stopwatch;
        private String name;
        private int speed;

        public Runner(String name, int speed) {
            this.name = name;
            this.speed = speed;
            this.stopwatch = new Stopwatch(this);
        }

        public String getName() {
            return name;
        }

        public int getSpeed() {
            return speed;
        }

        public void start() {
            stopwatch.start();
        }
    }
}


А точнее на строку
Thread.sleep((long)1000 / owner.speed);

Этот код компилируется и запускается.
Как это работает?? Почему?? ведь поле speed класса Runner объявлено:
private int speed;

Получается что можно получить доступ к private полям объекта?
Умные люди! Объясните пожалуйста или тыкните носом если ответ очевиден.

task13.task1328

6. Изменить код согласно новой архитектуре и добавить новую логику:

6.1. Сделать класс AbstractRobot абстрактным, вынести логику атаки и защиты из Robot в AbstractRobot.

6.2. Отредактировать класс Robot учитывая AbstractRobot.

6.3. Расширить класс BodyPart новой частью тела BodyPart.CHEST(«грудь«).

6.4. Добавить новую часть тела в реализацию интерфейсов Attackable и Defensable (в классе AbstractRobot).

public final class BodyPart
{
final static BodyPart LEG = new BodyPart(«нога»);
final static BodyPart HEAD = new BodyPart(«голова»);
final static BodyPart ARM = new BodyPart(«рука»);
final static BodyPart CHEST = new BodyPart(«грудь»);

private String bodyPart;

private BodyPart(String bodyPart)
{
this.bodyPart = bodyPart;
}

@Override
public String toString()
{
return this.bodyPart;
}
}

public class Robot extends AbstractRobot
{

private String name;

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

public String getName()
{
return name;
}

}

public abstract class AbstractRobot implements Attackable, Defensable
{
private static int hitCount;

public abstract String getName();

public BodyPart attack()
{
BodyPart attackedBodyPart = null;
hitCount = hitCount + 1;

if (hitCount == 1)
{
attackedBodyPart = BodyPart.ARM;
} else if (hitCount == 2)
{
attackedBodyPart = BodyPart.HEAD;
}
else if (hitCount == 3)
{

attackedBodyPart = BodyPart.LEG;
}
else if (hitCount == 4)
{
hitCount = 0;
attackedBodyPart = BodyPart.CHEST;
}
return attackedBodyPart;
}

public BodyPart defense()
{
BodyPart defencedBodyPart = null;
hitCount = hitCount + 1;

if (hitCount == 1)
{
defencedBodyPart = BodyPart.HEAD;
} else if (hitCount == 2)
{
defencedBodyPart = BodyPart.LEG;
}
else if (hitCount == 3)
{
defencedBodyPart = BodyPart.ARM;
}
else if (hitCount == 4)
{
hitCount = 0;
defencedBodyPart = BodyPart.CHEST;
}
return defencedBodyPart;
}

}

Валидатор говорит, что проблема в логике атаки и защиты. Но я пробовал абсолютно все варианты. Кто знает в чем проблема, буду очень благодарен.

task13.task1326

Сортировка четных чисел из файла
1. Ввести имя файла с консоли.
2. Прочитать из него набор чисел.
3. Вывести на консоль только четные, отсортированные по возрастанию.

Требования:
1. Программа должна считывать данные с консоли.
2. Программа должна вывести на экран все четные числа считанные из файла отсортированные по возрастанию.
3. Программа должна выводить данные на экран.
4. Программа должна закрывать поток чтения из файла(FileInputStream).

И все бы хорошо, если бы не надо было использовать именно FileInputStream

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.io.FileInputStream;
import java.io.InputStream;

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

keyReader.close();
ArrayListlist = new ArrayList();

///fileReader.read(); // удаляем первый символ

while (fin.available() > 0 ){

int a = fin.read();
if (a % 2 == 0) {
list.add(a);
}
}
Collections.sort(list);
for (Integer i: list) {
System.out.println(i);
}

// напишите тут ваш код c:/temp/txt.txt

fin.close();
}
}

С любым другим классом работает, кроме этого. Что не так?
  • ,

task31.3101 неправильный вывод

Друзья, помогите пожалуйста. Проблема такая, задачу решил, валидатор скушал, но вывод получается неправильный. Понимаю, что-то не так с компаратором, но что именно допереть не могу. Без компаратора читает и пишет из директорий хорошо, но соответственно без сортировки. С сортировкой получается приведенный ниже вывод.Пробовал вынести из try-with-resources — вообще не сортирует. Подскажите что не так, хочется понять.

java.lang.NumberFormatException В плагине JavaRush Task

Добрый день. При выполнении задач JavaRush через плагин для IDEA получаю вот такую ошибку.
Exception in thread «main» java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at com.javarush.task.task10.task1017.Solution.main(Solution.java:17)

Process finished with exit code 1
При этом, если тот же код запустить просто в IDEA (не в плагине) или на сайте, все работает. Буду благодарен за помощь. (Не так давно всё было хорошо и подобных ошибок не вылетало)
На всякий случай код ниже.


package com.javarush.task.task05.task0532;

import java.io.*;

/* 
Задача по алгоритмам
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        int maximum = Integer.MIN_VALUE;
        for (int i = 0; i < N; ++i){
            int temp = Integer.parseInt(reader.readLine());
            if (temp > maximum){
                maximum = temp;
            }

        }


        //напишите тут ваш код

        System.out.println(maximum);
    }
}

task.task18.task1827

Коллеги! Объясните мне тупому почему не принимает валидатор мое решение. Кто решил — скиньте пожалуйста свое решение на vik.piter@gmail.com
Программа все делает правильно… но не принимает!
Уже не могу сидеть на этом задании…

Прайсы


CrUD для таблицы внутри файла.
Считать с консоли имя файла для операций CrUD.

Программа запускается со следующим набором параметров:
-c productName price quantity

Значения параметров:
где id — 8 символов.
productName — название товара, 30 chars (60 bytes).
price — цена, 8 символов.
quantity — количество, 4 символа.

-c — добавляет товар с заданными параметрами в конец файла, генерирует id самостоятельно, инкрементируя максимальный id, найденный в файле.

В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity

Данные дополнены пробелами до их длины.

Пример:
19846 Шорты пляжные синие 159.00 12
198478 Шорты пляжные черные с рисунко173.00 17
19847983 Куртка для сноубордистов, разм10173.991234

Требования:
1. Программа должна считать имя файла для операций CrUD с консоли.
2. При запуске программы без параметров список товаров должен остаться неизменным.
3. При запуске программы с параметрами "-c productName price quantity" в конец файла должна добавится новая строка с товаром.
4. Товар должен иметь следующий id, после максимального, найденного в файле.
5. Форматирование новой строки товара должно четко совпадать с указанным в задании.
6. Созданные для файлов потоки должны быть закрыты.

package com.javarush.task.task18.task1827;

/* 
Прайсы
*/

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

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

        if (args[0].equals("-c") && args.length == 4) {


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

            // получаем параметры для прибавления

            String productName = args[1];
            if (productName.length() > 30) {
                productName = args[1].substring(0, 29);
            } else {
                while ((30 - productName.length()) != 0) {
                    productName += " ";
                }
            }

            String price = args[2];
            if (price.length() > 8) {
                price = args[2].substring(0, 7);
            } else {
                while ((8 - price.length()) != 0) {
                    price += " ";
                }
            }

            String quantity = args[3];
            if (quantity.length() > 4) {
                quantity = args[3].substring(0, 3);
            } else {
                while ((4 - quantity.length()) != 0) {
                    quantity += " ";
                }
            }

            // нашли id который надо прибавить
            FileReader fileReader = new FileReader(fileName);
            StringBuilder sb = new StringBuilder();
            while (fileReader.ready()) {
                sb.append((char) fileReader.read());
            }
            fileReader.close();

            String sub2parse = sb.toString().substring(sb.toString().length() - 50, sb.toString().length() - 42);

            StringBuilder sb2 = new StringBuilder();

            Integer t;
            for (char c : sub2parse.toCharArray()) {
                t = Integer.parseInt(String.valueOf©);
                if (t instanceof Integer) {


                }

                if (c != ' ') {
                    sb2.append©;
                }
            }


            double id = Double.parseDouble(sb2.toString());


            if (id < 99999999) {
                id++;
            }

            // добавили к id нужные пробелы
            String idString = Double.toString(id);
            if (idString.length() < 8) {
                while ((8 - idString.length()) != 0) {
                    idString += " ";
                }
            }

            // генерим нашу выстраданную строчку
            String string = idString + productName + price + quantity;

            // считываем все в массив
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            ArrayList<String> ss = new ArrayList<String>();
            while (br.ready()) {
                ss.add(br.readLine());
            }
            br.close();

            BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
            for (String str : ss) {
                bw.write(str);
            }
            bw.write(string);
            bw.close();


        }
    }
}