• ,

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

Список недобросовестных работодателей

Интересно, а есть среди работодателей недобросовестные!? Или в этой сфере такого не бывает? Слышал, что дают тестовые задания, принимают эти решения, используют их в своих проектах, а тем, кто написал решения этих тестовых заданий — просто отказывают.
Ну это кроме всяких задержек зарплаты и прочего, что есть везде.
Интересует существуют ли такой список где-то здесь или ещё на каких сайтов айтишников.

Пока, собственно интересует Санкт-Петербург. Просто уже месяца два или три периодически мониторю вакансии в этом городе, и уже несколько месяцев висят вакансии одних и тех же фирм. Вот, странно, чего это они там висят!? То ли вакансии липовые, то ли там так хреново, что никто не остаётся надолго, то ли у самой фирмы слишком запредельные требования… странно…
  • ,

Update JavaRush

Друзья! Пришло время очередного обновления JavaRush =)



В рамках текущего большого апдейта мы исправили часть ошибок, о которых вы нам писали, и реализовали ряд предложенных вами функций:

  1. Ссылки на лекции, уровни и квесты стали кликабельными.

  2. Когда вы приобретаете подписку или происходит автопродление вашей текущей подписки, на ваш email будет отправлено уведомление.

  3. Сообщения помечаются как прочитанные после кликов по ним.

  4. Плагин JavaRush полностью поддерживает новую версию IntelliJ IDEA 2017.

  5. Плагин был переключен с протокола http на защищенный https.

  6. Добавлен поиск задачи по её идентификатору.

  7. Улучшены и проверены условия или механизм проверки таких задач: task3513(8), task3310(10), task3310(15), task1620, task2401, task0108, task3209, task2909(13), task2312, task1519, task2025, task3209(2), task1822, task3504, task0517, task3003, task2508, task3710, task0718, task3105, task1410, task0711, task2712, task2712(01), task1903, task0526, task0134, task3101, task2025, task2909, task0306, task2712(16).

  8. Усовершенствована функция Continued Education (эта функция позволяет сохранять решения пользователей с подпиской Premium Pro на сервере JavaRush). Теперь Continued Education поддерживает сохранение бинарных файлов из плагина.

  9. Исправлено начальное количество черной материи для новых пользователей.

  10. Реализована автоматическая прокрутка окна, в котором открывается задание на набор текста.

  11. Также мы подняли минимальный уровень участия в онлайн стажировке с 30 до 35, поскольку на старших уровнях JavaRush есть материал, который облегчит вам прохождение стажировки и значительно повысит пользу от неё.

  12. А также:
    • Улучшена главная страница JavaRush.
    • Улучшен механизм изменения аватарки пользователя.
    • Исправлено отображение LinkedIn в списке привязанных соцсетей.
    • Возвращен список приглашенных пользователей.
    • Исправлено отображение комментариев с очень длинными словами.
    • Убрано слово «Требования» в условиях заданий по набору текстов и просмотру видеороликов.
    • Исправлены тексты сообщений об ошибках в плагине и WebIDE.

Что такое мьютекс и что такое монитор?

Задался вопросом понять, что есть что. Так как в разных источниках по-разному используют эти термины. И часто даже бывает, что в одной статье что-либо, например, кусок кода, называют монитором, в другой — это называют мьютексом (и бывает наоборот — объект, связанный с данным, и отвечающий на синхронизацию нитей, называют то мьютексом, то монитором). Вот и хочу разобраться, что есть что. (могу, конечно, привести множество цитат из этих источников, где употребляются эти термины, но думаю, это будет избыточно.)

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

Ребят, мне кажется что 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);
            }
        }
    }
}