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

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

task22.task2209

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

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

Результат:
Амстердам Мельбурн Нью-Йорк Киев Вена

Требования:
1. Метод main должен считывать имя файла с клавиатуры.
2. В методе getLine должен быть использован StringBuilder
3. Метод getLine должен возвращать пустую строку(пустой StringBuilder) в случае если ему не были переданы параметры(слова).
4. Все слова переданные в метод getLine должны быть включены в результирующую строку, если это возможно.
5. Вывод на экран должен соответствовать условию задачи.

/////////

Я вот написал код, позволяющий найти все возможные варианты расстановки слов. Где-то получается длиннее, где-то короче и.т. д.
На картинке можно посмотреть комбинации.
Взял эти города — Пекин Гонконг Токио Москва Париж Лондон Киев Нью-Йорк Амстердам Вена Мельбурн Телявив Осака Оренбург Таганрог Гагарин.

Действительно ли нужно добавлять оставшиеся слова не попавшие никуда в конец? Просто об этом в условии ни хреналеона нету! И это бредово.

Метод getLine должен возвращать любой вариант. Это как понимать? Я должен возвращать какой-то рандомный варинат строки удовлетворяющий результату?

Сейчас валидатор не принимает:

(- тут я возвращаю самый длинный результат)
Все слова переданные в метод getLine должны быть включены в результирующую строку, если это возможно.

Вывод на экран должен соответствовать условию задачи. (казалось бы какому условию, просто через пробел да с большой буквы. Как он может не соответствовать?....)

package com.javarush.task.task22.task2209;

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

/*
Составить цепочку слов
*/
public class Solution {
    public static void main(String[] args) throws IOException {
        //...

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

        FileReader fileReader = new FileReader(fileName);


        StringBuilder file = new StringBuilder();
        while (fileReader.ready()){
            file.append((char) fileReader.read());
        }


        String[] strings = file.toString().split(" ");

        for (int x = 0; x< strings.length; x++){
           strings[x] = strings[x].toLowerCase();
        }

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

    public static StringBuilder getLine(String... words) {

        if(words!=null && words.length!=0) {   // проверка на условие валидатора

            ArrayList<StringBuilder> megaList = new ArrayList<>(); // тут хранию все возможные комбинации

            ArrayList<String> originalList = new ArrayList<>();  // оригинальный лист стрингов

            for (String word : words) {
                originalList.add(word.toLowerCase()); // делаю всё с маленькой буквы
            }

            int k = originalList.size();   

            while (k > 0) {   //  повторяем цик столько раз, сколько у нас элементов в оригинальном массиве
                StringBuilder stringBuilder = new StringBuilder();
                ArrayList<String> copyOfList = new ArrayList<>(originalList);  // копия оригинального листа

                ArrayList<String> list = new ArrayList<>();  // лист где я храню подобранные слова

                list.add(copyOfList.get(k-1));  // начинаю с конца (не важно) сразу добавляю один (последний) в лист
                copyOfList.remove(k-1);  // и удаляю его из копии листа оригинала

                int n = copyOfList.size();
                while (n > 0) {  //  повторяем цик столько раз, сколько у нас элементов в оригинальном массиве

                    //тут стравниваем буквы, если есть совпадение, то удалячем из копии листа объект под индексом index
                    int index = -1;
                    for (int x = 0; x < copyOfList.size(); x++) {

                        String str1 = copyOfList.get(x);
                        String str2 = list.get(list.size() - 1);

                        char ch1 = str1.charAt(0);
                        char ch2 = str2.charAt(str2.length() - 1);

                        if (ch1 == ch2) {
                            list.add(str1);
                            index = x;
                            break;
                        }
                    }

                    if (index != -1) {
                        copyOfList.remove(index);
                    }

                    n--;
                }

                
                // возвращаем заглавные буквы и морфмируем stringBuilder
                for (String into : list) {
                    String str = into;
                    str = Character.toUpperCase(str.charAt(0)) + str.substring(1);

                    stringBuilder.append(str).append(" ");
                }
                // удаляем пробел 
                stringBuilder.replace(stringBuilder.length()-1,stringBuilder.length(),"");
                megaList.add(stringBuilder);

                k--;
            }

            // тут я просто нахожу самую длинную комбинацию
            int maxIndex=0;
            int lenght=megaList.get(0).length();

            for (int e = 1; e < megaList.size(); e++ ){
                if(megaList.get(e).length()>=lenght) {
                    lenght = megaList.get(e).length();
                    maxIndex = e;
                }
            }

          //  System.out.println(megaList);
            return megaList.get(maxIndex);
        }

    return new StringBuilder();
    }
}

Ошибка incompatible types в task14.task1405;

Всем привет. помогите разобраться, понимаю что решение простое… но что то не доходит какое именно!
ошибка
"
incompatible types: com.javarush.task.task14.task1405.Solution.Food cannot be converted to com.javarush.task.task14.task1405.Solution.Selectable:
Solution.java, line: 10, column: 33
"
Вывод компилятора:
com/javarush/task/task14/task1405/Solution.java:10: error: incompatible types: com.javarush.task.task14.task1405.Solution.Food cannot be converted to com.javarush.task.task14.task1405.Solution.Selectable
Selectable selectable = new Food();

/*
Food
1. Реализовать интерфейс Selectable в классе Food.
2. Метод onSelect() должен выводить на экран фразу «food was selected«.
3. Подумай, какие методы можно вызвать для переменной food и какие для selectable.
4. В методе foodMethods вызови методы onSelect, eat, если это возможно.
5. В методе selectableMethods вызови методы onSelect, eat, если это возможно.
6. Явное приведение типов не использовать.
*/

public class Solution {
    public static void main(String[] args) {
        Food food = new Food();
        Selectable selectable = new Food();
        Food newFood = (Food) selectable;

        foodMethods(food);
        selectableMethods(selectable);
    }

    public static void foodMethods(Food food) {
       food.eat();
        food.onSelect();

    }

    public static void selectableMethods(Selectable selectable) {
        selectable.onSelect();

    }

    interface Selectable {
        void onSelect();
    }

    static class Food {
        public void onSelect() {
            System.out.println("food was selected");
        }
        public void eat() {
            System.out.println("food was eaten");
        }
    }
}

Оценка попыток решения задач и конечный счет

Ребят, мне кажется что java rush ранее выдавала куда более красивую и правдоподобную статистику по тому как вы решили ту или иную задачу. Я имею ввиду среднее количество попыток на сколько успешнее вы решили задачу по сравнению с остальными. Что вы думаете на этот счет?

level19.lesson10.home09 READER-обертка, помогите!

Моя программа в двух вариантах, и ни один из вариантов не проходит проверку на сервере! подскажите, в чем может быть дело?
<em>/* Контекстная реклама
В методе main подмените объект System.out написанной вами реадер-оберткой
Ваша реадер-обертка должна выводить на консоль контекстную рекламу после каждого второго println-а
Вызовите готовый метод printSomething(), воспользуйтесь testString
Верните переменной System.out первоначальный поток

Рекламный текст: "JavaRush - курсы Java онлайн"

Пример вывода:
first
second
JavaRush - курсы Java онлайн
third
fourth
JavaRush - курсы Java онлайн
fifth
*/</em>

— Вариант 1:
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

public class Solution {

    public static void main(String[] args) {
        PrintStream originalConsolePrintStream = System.out;
        ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
        PrintStream customOutputStream = new PrintStream(byteArray);
        System.setOut(customOutputStream);
        new TestString().printSomething();

        System.setOut(originalConsolePrintStream);

        String lines[] = byteArray.toString().split(System.lineSeparator());
        for (int i = 0; i < lines.length; i++) {
            System.out.println(lines[i]);
            if (i % 2 != 0) {
                System.out.println("JavaRush - курсы Java онлайн");
            }
        }

    }

    public static class TestString {
        public void printSomething() {
            System.out.println("first");
            System.out.println("second");
            System.out.println("third");
            System.out.println("fourth");
            System.out.println("fifth");
        }
    }
}

— Вариант 2
import java.io.*;

public class Solution {

    public static void main(String[] args) {
        PrintStream orig = System.out;
        System.setOut(new outputStreamDecorator(orig));
        TestString t = new TestString();
        t.printSomething();
        System.setOut(orig);

    }

    public static class TestString {
        public void printSomething() {
            System.out.println("first");
            System.out.println("second");
            System.out.println("third");
            System.out.println("fourth");
            System.out.println("fifth");
        }
    }

    static class outputStreamDecorator extends PrintStream {
        String ad = "JavaRush - курсы Java онлайн";
        static int counter = 0;
        public outputStreamDecorator(OutputStream out) {
            super(out);
        }

        public void println(String s) {
            super.println(s);
            counter++;
            if (counter % 2 == 0 ){
                super.println(ad);
            }
        }
    }
}

Как в новом плагине загружать задачи без сброса прогресса?

В старом плагине, насколько я помню, при открытии уже решённой задачи, решение не пропадало. Сейчас сразу же предупреждение при открытии, что файлы будут сброшены. Можно как-то вернуть на старый вариант? Сейчас получается, что нельзя посмотреть своё же решение. Закрыл задачу, потом открыл и решение сброшено.

  • ,

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