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

Level36.lesson06.task01 | tast36.task3602

Не получается решить. Условие задачи:
Найти класс по описанию

Описание класса:

1. Реализует интерфейс List;

2. Является приватным статическим классом внутри популярного утилитного класса;

3. Доступ по индексу запрещен — кидается исключение IndexOutOfBoundsException.

Используя рефлекшн (метод getDeclaredClasses), верни подходящий тип в методе getExpectedClass.

Вот мой код:

public static Class getExpectedClass() {

        Class[] classes = Collections.class.getDeclaredClasses();
        for (Class classOfClasses: classes) {
            if (!List.class.isAssignableFrom(classOfClasses))
                continue;

            int modifiersOfClass = classOfClasses.getModifiers();
            boolean hasPrivateStaticModifiers = false;
            if (Modifier.isPrivate(modifiersOfClass) && Modifier.isStatic(modifiersOfClass))
                hasPrivateStaticModifiers = true;

            if (! hasPrivateStaticModifiers)
                continue;

            Method[] methodsOfClass = classOfClasses.getDeclaredMethods();
            boolean isDisallowedAccessByIndex = false;
            for (Method methodOfClass: methodsOfClass) {

                Class[] params = methodOfClass.getParameterTypes();

                boolean hasIntegerParam = false;
                for (Class paramClass: params) {
                    if (paramClass.equals(int.class) || paramClass.equals(Integer.class)) {
                        hasIntegerParam = true;
                        break;
                    }
                }

                boolean throwsIndexOutOfBoundsException = false;
                if (hasIntegerParam) {
                    Object[] inputObjects  = new Object[params.length];
                    for (int i = 0; i < inputObjects.length; i++) {
                        try {
                            boolean isLong = params[i].equals(long.class);
                            boolean isInt = params[i].equals(int.class);
                            boolean isShort = params[i].equals(short.class);
                            boolean isByte = params[i].equals(byte.class);
                            boolean isChar = params[i].equals(char.class);
                            boolean isFloat = params[i].equals(float.class);
                            boolean isDouble = params[i].equals(double.class);
                            boolean isBoolean = params[i].equals(boolean.class);
                            boolean isString = params[i].equals(String.class);


                            if (isLong || isInt || isShort || isByte)
                                inputObjects[i] = 1;
                            else if (isChar)
                                inputObjects[i] = 'a';
                            else if(isFloat || isDouble)
                                inputObjects[i] = 1.0f;
                            else if (isBoolean)
                                inputObjects[i] = true;
                            else if (isString)
                                inputObjects[i] = "aaa";
                            else
                                inputObjects[i] = params[i].newInstance();

                        } catch (InstantiationException|IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }

                    if (Modifier.isPrivate(methodOfClass.getModifiers()))
                        methodOfClass.setAccessible(true);
                    if (Modifier.isStatic(methodOfClass.getModifiers())) {
                        try {
                            methodOfClass.invoke(null, inputObjects);
                        } catch (IllegalAccessException|InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (IndexOutOfBoundsException e) {
                            throwsIndexOutOfBoundsException = true;
                        }
                    }
                    else {
                        try {
                            Object instanceOfClass = null;
                            try {
                                instanceOfClass = classOfClasses.newInstance();
                            } catch (InstantiationException e) {
                                Constructor constructor = classOfClasses.getDeclaredConstructors()[0];
                                Class[] paramsConstr = constructor.getParameterTypes();
                                Object[] inputObjectsInConstr  = new Object[paramsConstr.length];
                                for (int i = 0; i < inputObjectsInConstr.length; i++) {
                                    try {
                                        boolean isLong = paramsConstr[i].equals(long.class);
                                        boolean isInt = paramsConstr[i].equals(int.class);
                                        boolean isShort = paramsConstr[i].equals(short.class);
                                        boolean isByte = paramsConstr[i].equals(byte.class);
                                        boolean isChar = paramsConstr[i].equals(char.class);
                                        boolean isFloat = paramsConstr[i].equals(float.class);
                                        boolean isDouble = paramsConstr[i].equals(double.class);
                                        boolean isBoolean = paramsConstr[i].equals(boolean.class);
                                        boolean isString = paramsConstr[i].equals(String.class);


                                        if (isLong || isInt || isShort || isByte)
                                            inputObjects[i] = 1;
                                        else if (isChar)
                                            inputObjects[i] = 'a';
                                        else if(isFloat || isDouble)
                                            inputObjects[i] = 1.0f;
                                        else if (isBoolean)
                                            inputObjects[i] = true;
                                        else if (isString)
                                            inputObjects[i] = "aaa";
                                        else
                                            inputObjects[i] = paramsConstr[i].newInstance();

                                    } catch (InstantiationException|IllegalAccessException ex) {
                                        ex.printStackTrace();
                                    }
                                }
                                if (Modifier.isPrivate(constructor.getModifiers()))
                                    constructor.setAccessible(true);
                                try {
                                    instanceOfClass = constructor.newInstance(inputObjectsInConstr);
                                } catch (IllegalAccessException|InstantiationException e1) {
                                    e1.printStackTrace();
                                }

                            }

                            methodOfClass.invoke(instanceOfClass, inputObjects);
                        } catch (IllegalAccessException|InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (IndexOutOfBoundsException e) {
                            throwsIndexOutOfBoundsException = true;
                        }

                    }
                }

                if (hasIntegerParam && throwsIndexOutOfBoundsException)
                    isDisallowedAccessByIndex = true;
            }

            if (isDisallowedAccessByIndex)
                return classOfClasses;
        }


        return null;
    }

Одна строчка выкидывает IllegalAccessException. Такая:

instanceOfClass = constructor.newInstance(inputObjectsInConstr);

level31.lesson02.home01

Никак не пойму, почему не принимает

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. Поток для записи в файл нужно закрыть.


public class Solution {
    public static void main(String[] args) throws IOException {
        File folder = new File(args[0]);
        File resultFileAbsolutePath = new File(args[1]);
        File allFilesContent = new File(resultFileAbsolutePath.getParent() + "/allFilesContent.txt");
        FileUtils.renameFile(resultFileAbsolutePath, allFilesContent);
        FileOutputStream fos = new FileOutputStream(allFilesContent);
        ArrayList<File> list = new ArrayList<>();
        for (File file : folder.listFiles())
            list.add(file);
        ArrayList<File> list1 = new ArrayList<>();
        for (File file : list) {
            if (file.length() > 50) {
                FileUtils.deleteFile(file);
            } else {
                list1.add(file);
            }
        }
        Collections.sort(list1, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return o1.toString().compareTo(o2.toString());
            }
        });


        for (File file : list1) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String s = "";
            while ((s = reader.readLine()) != null){
                try {
                    fos.write((s + "\n").getBytes());
                }
                catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                }
                finally {
                    fos.close();
                }
            }
            reader.close();

        }
        

    }

Не проходит задача task08.task0812 (РЕШЕНО)

Добрый день. Помогите пожалуйста с задачей. В чём может быть проблема? Условие:
Cамая длинная последовательность
1. Создай список чисел.
2. Добавь в список 10 чисел с клавиатуры.
3. Вывести на экран длину самой длинной последовательности повторяющихся чисел в списке.

Пример для списка 2, 4, 4, 4, 8, 8, 9, 12, 12, 14:
3

Искомое значение равно 3, т.к. самая длинная последовательность повторяющихся чисел состоит из трех четверок.

Требования:
1. Программа должна выводить число на экран.
2. Программа должна считывать значения с клавиатуры.
3. В методе main объяви переменную типа ArrayList с типом элементов Integer и сразу проинициализируй ee.
4. Программа должна добавлять в коллекцию 10 чисел, согласно условию.
5. Программа должна выводить на экран длину самой длинной последовательности

последнее условие не выполняется

package com.javarush.task.task08.task0812;

import java.io.*;
import java.util.*;

/* 
Cамая длинная последовательность
*/
public class Solution {
    public static void main(String[] args) throws IOException {
        //напишите тут ваш код

        BufferedReader bRead = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(Integer.parseInt(bRead.readLine()));
        }

        Map<Integer, Integer> map = new HashMap<>();

        for(Integer i : list){
            if(map.containsKey(i)){
                map.put(i, map.get(i)+1);
            } else {
                map.put(i, 1);
            }
        }

        System.out.println(Collections.max(map.values()));
    }
}

Какая-то ерунда с балансом черной материи!!!

Уважаемая администрация сайта JavaRush. В целом вы сделали достойный ресурс, который помогает окунуться в мир Java. Пусть он не дает полной картины, и не учит многому, а только основам, но в любом случае — Мне нравится. Почти все. Нравится и новый сайт (хотя и старый был тоже очень не плох, хотя да, новые тенденции, новые веяния и прочее, прочее, прочее). Даже новый валидатор хорошо, как бы его не ругали, но с ним реально стало лучше, хоть и бывают случаи «вымораживания» )))). Но в целом все достаточно не плохо. Т.е. очень хорошо.

И вот возвращаюсь к тому, что нравится почти все.

Об этом ПОЧТИ ВСЕ и хочется поговорить.

Новый баланс материи какой-то глупый, либо не правильный. Были подозрения на это очень давно, и вот перейдя на уровень с 4.JavaCollection 1 лекция — работа с файлами, я просто посчитал сколько материи заработается за одну эту лекцию и сколько спишется. Поолучается совсем ерунда.
За 1 лекцию списывается 336 черной материи, а заработать можно вселишь только 198. Т.е получается какое-то полное не соответствие того, что можно заработать и того, что можно потратить. Баланс нарушен — т.е. его нет совсем.

198 != 336, ни как, ни сколько не равно, ни больше чем списано. А совсем, совсем меньше того, что нужно.

И про это уже было написано в какой-то из тем. Но что поменялось? Все осталось то же самое.

Это настораживает и немного пугает.

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

Заранее спасибо за понимание.

level18.lesson10.home06 - "ну и как тут? " или "енибади, хелп!"

ну и как всегда Джавараш ничего нормально придумать не может… дада, посмею это сказать
кто что скажет-подскажет/поможет?
Я работаю на Маке, по етому не вкурсе как скрафтить файл для теста для подобных задачек..
package com.javarush.test.level18.lesson10.home06;

/* Встречаемость символов
Программа запускается с одним параметром - именем файла, который содержит английский текст.
Посчитать частоту встречания каждого символа.
Отсортировать результат по возрастанию кода ASCII (почитать в инете). Пример: ','=44, 's'=115, 't'=116
Вывести на консоль отсортированный результат:
[символ1]  частота1
[символ2]  частота2
Закрыть потоки. Не использовать try-with-resources

Пример вывода:
, 19
- 7
f 361
*/

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

public class Solution {
    public static void main(String[] args) throws IOException {
        FileInputStream input = new FileInputStream(args[0]);
        byte[] freqList = new byte[128]; //создали список уже "отсортирован" по возростанию ascii кода

        while(input.available() > 0){ //читаем по каждому байту
            int b = input.read();
            freqList[b]++; // и просто инкрементируем "счетчик" того или иного байта который нам попался
        }
        input.close();

        for (int i : freqList){
            int ch = freqList[i];
            System.out.println((char)ch + i);
        }
    }
}

level18.lesson10.home05 что за чертовщина происходит??? п.с работаю на маке, так что проверить действие файлов не могу/не умею

package com.javarush.test.level18.lesson10.home05;

/* Округление чисел
Считать с консоли 2 имени файла
Первый файл содержит вещественные(дробные) числа, разделенные пробелом. Например, 3.1415
Округлить числа до целых и записать через пробел во второй файл
Закрыть потоки. Не использовать try-with-resources
Принцип округления:
3.49 - 3
3.50 - 4
3.51 - 4
-3.49 - -3
-3.50 - -3
-3.51 - -4
*/

import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file1 = reader.readLine();
        String file2 = reader.readLine();
        reader.close();
        FileInputStream input = new FileInputStream(file1);
        FileWriter output = new FileWriter(file2);

        while(input.available() > 0){
            float flo = Math.round(input.read());
            output.write(flo + " ");
        }
        output.close();
        reader.close();
        input.close();

    }
}
  • ,

com.javarush.task.task18.task1813

Подскажите где я не прав в ходе рассуждения.

Задание
AmigoOutputStream
1 Измени класс AmigoOutputStream так, чтобы он стал Wrapper-ом для класса FileOutputStream. Используй наследование.
2 При вызове метода close() должны выполняться следующая последовательность действий:
2.1 Вызвать метод flush().
2.2 Дописать следующий текст «JavaRush © All rights reserved.«, используй метод getBytes().
2.3 Закрыть поток методом close().

Требования:
1. Метод main изменять нельзя.
2. Класс AmigoOutputStream должен наследоваться от класса FileOutputStream.
3. Класс AmigoOutputStream должен принимать в конструкторе обьект типа FileOutputStream.
4. Все методы write(), flush(), close() в классе AmigoOutputStream должны делегировать свое выполнение объекту FileOutputStream.
5. Метод close() должен сначала вызвать метод flush(), затем дописать текст, затем закрыть поток.

Рыба:
public class AmigoOutputStream {
    public static String fileName = "C:/tmp/result.txt";

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

}


1. Хотят наследование — ну окей, добавляем
public class AmigoOutputStream extends FileOutputStream

2. Но в конструкторе хотят увидеть:

    private FileOutputStream fileOutputStream;
    public AmigoOutputStream(FileOutputStream fileOutputStream) throws FileNotFoundException {
        super(fileName);
        this.fileOutputStream = fileOutputStream;
    }


Но в main у нас:
new AmigoOutputStream(new FileOutputStream(fileName));


Т.е. в консруктор я принимаю FileOutputStream(fileName), но мне приходится еще дергать super(fileName);

Зачем fileName использовать два раза?

Ну и я не понимаю — мы создаем объект AmigoOutputStream как потомом FileOutputStream, но работает внутри AmigoOutputStream с другим FileOutputStream (который private FileOutputStream fileOutputStream)
  • ,

Спрячьте требования задач под кат!

Дорогие разработчики,

Большая просьба спрятать под кат требования к задачам, по которым идет тест решения. Ну или шрифтом черным по черному писать, чтобы только при выделении было видно.
А то реальный спойлер.

Думаю, что многие меня поддержат.
  • ,

task19.task1920 Выход за пределы массива

Друзья, подскажите пожалуйста в чем может быть проблема. Компилятор ругается на выход за пределы массива при добавлении элементов в map; конкретно ArrayIndexOutOfBoundsException: 1 Я уже пробовал копировать вставлять решения других людей, у которых вроде как все работало, но у меня летит этот Exception ArrayIndexOutOfBoundException В качестве входного файла (args[0]) взял txt файл такого содержания

/*Petrov 2
Sidorov 6
Ivanov 1.35
Petrov 3.1
Ivanov 5
Elnikov 10
Elnikov 1.1
Agutin 11.1*/


Как я понимаю при таком варианте мне должно вывести в итоге Agutin 11.1 Elnikov 11.1

package com.javarush.task.task19.task1920;
/*
В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя значение
где [имя] — String, [значение] — double. [имя] и [значение] разделены пробелом.
Для каждого имени посчитать сумму всех его значений.
Вывести в консоль имена в алфавитном порядке, у которых максимальная сумма.
Имена разделять пробелом либо выводить с новой строки.
Закрыть потоки.
*/
    public class Solution {
        public static void main(String[] args) throws IOException {    
            BufferedReader reader = new BufferedReader(new FileReader(args[0]));
            Map<String, Double> map = new TreeMap<>();
            while (reader.ready()) {
                String[] s = reader.readLine().split(" ");
                if (map.containsKey(s[0])) {
                    map.put(s[0], map.get(s[0]) + Double.parseDouble(s[1]));
                } else {
                    map.put(s[0], Double.parseDouble(s[1]));
                }
            }
            reader.close();
            Double max = 0.0;
            for (Double d : map.values()) {
                if (d > max) max = d;
            }
            for (Double d : map.values()) {
                if (d == max) System.out.println(map.get(d));
            }
        }
    }

task30.task3010 не проходит тестирование, прошу помочь

Добрый день. прошу помощи в решении задания task30.task3010.

Минимальное допустимое основание системы счисления
В метод main первым аргументом приходит строка, которая содержит последовательность символов (Все символы в строке имеют коды в таблице ASCII от 32 до 127 включительно). Длина строки не превышает 255 символов. Нужно реализовать программу, которая по входящей строке определит, является ли содержимое строки записью числа в системе счисления с основанием не больше 36 включительно. Если является — нужно вывести минимальное основание системы счисления, в которой это число может существовать. Если не является — необходимо вывести «incorrect».
В системах счисления с основанием большим 10 в качестве цифр используются латинские буквы. К примеру, числу 35 в десятичной системе соответствует число «Z» в системе с основанием 36. Так как рассматриваем позиционные системы счисления — минимальное основание, которое должна выводить программа, это 2.
Если возникают любые исключения — перехватывай их и не выводи стек-трейс.

Пример1:
Вход:
00
Ожидаемый вывод:
2

Пример2:
Вход:
12AS08z
Ожидаемый вывод:
36

Пример3:
Вход:
12AS08Z/
Ожидаемый вывод:
incorrect

Требования:
1. Если возникло любое исключение — необходимо перехватить его и не выводить стек-трейс.
2. Если входящая строка содержит что-либо, кроме латинских букв и цифр — необходимо вывести «incorrect».
3. Если входящая строка корректна — необходимо вывести основание системы счисления.
4. Минимальное основание, которое выводит программа должно равняться 2.
5. Вывод программы должен соответствовать условию.

При проверке на сервере проходит всё кроме



public class Solution {
    public static void main(String[] args) {
        try {
            String num = args[0];

            if (!num.matches("\\w+")){
                System.out.println("incorrect");
                return;
            }

            for(int i = 2;i < 37;i++){
                try {
                    Long.parseLong(num, i);
                    System.out.println(i);
                    break;
                } catch (NumberFormatException e) {
                    /*NOP*/
                }
            }
        } catch (Exception e) {
            /*NOP*/
        }
    }
}

task30.task3002 не проходит тестирование РЕШЕНА

Добрый день. Прошу помощи в решении задачи, вроде ничего сложного, но тестирование не проходит. Подскажите в чём может быть проблема.

Осваиваем методы класса Integer
Используя метод Integer.parseInt(String, int) реализуй логику метода convertToDecimalSystem, который должен переводить переданную строку в десятичное число и возвращать его в виде строки.

Требования:
1. Метод convertToDecimalSystem (String), возвращающий String, должен существовать.
2. Метод convertToDecimalSystem (String), возвращающий String, должен иметь модификаторы доступа: public, static.
3. Метод convertToDecimalSystem (String), возвращающий String, должен переводить переданную строку в десятичное число и возвращать его в виде строки.
4. Метод convertToDecimalSystem (String) должен вызывать метод Integer.parseInt(String, int).
5. Метод main (String[]), возвращающий void, должен иметь модификаторы доступа: public, static.

Четвёртый пункт ни в какую не проходит, хотя метод вызывается.

package com.javarush.task.task30.task3002;

/* 
Осваиваем методы класса Integer
*/
public class Solution {

    public static void main(String[] args) {
        System.out.println(convertToDecimalSystem("0x16")); //22
        System.out.println(convertToDecimalSystem("012"));  //10
        System.out.println(convertToDecimalSystem("0b10")); //2
        System.out.println(convertToDecimalSystem("62"));   //62
    }

    public static String convertToDecimalSystem(String s) {
        //напишите тут ваш код
        String result ="";
        String tmp;
      if (s.startsWith("0x")){
          tmp = s.substring(2,s.length());
          result = String.valueOf(Integer.parseInt(tmp,16));
      }
      else if (s.startsWith("0b")){
          tmp = s.substring(2,s.length());
          result = String.valueOf(Integer.parseInt(tmp,2));
      }
      else if (s.startsWith("0")){
          tmp = s.substring(1,s.length());
          result = String.valueOf(Integer.parseInt(tmp,8));
      }
      else
          result = s;
        return result;
    }
}