• ,

task30.task3008 Задание 19

1. Переопредели метод clientMainLoop():

а) С помощью метода sendTextMessage() отправь сообщение с текстом «Привет чатику. Я бот. Понимаю команды: дата, день, месяц, год, время, час, минуты, секунды.»

б) Вызови реализацию clientMainLoop() родительского класса.

2. Переопредели метод processIncomingMessage(String message). Он должен следующим образом обрабатывать входящие сообщения:

а) Вывести в консоль текст полученного сообщения message.

б) Получить из message имя отправителя и текст сообщения. Они разделены «: «.

в) Отправить ответ в зависимости от текста принятого сообщения.

Если текст сообщения:

«дата» – отправить сообщение содержащее текущую дату в формате «d.MM.YYYY«;

«день» – в формате «d«;

«месяц» — «MMMM«;

«год» — «YYYY«;

«время» — «H:mm:ss«;

«час» — «H«;

«минуты» — «m«;

«секунды» — «s«.

Указанный выше формат используй для создания объекта SimpleDateFormat. Для получения текущей даты необходимо использовать класс Calendar и метод getTime().

Ответ должен содержать имя клиента, который прислал запрос и ожидает ответ, например, если Боб отправил запрос «время«, мы должны отправить ответ «Информация для Боб: 12:30:47«.

Наш бот готов. Запусти сервер, запусти бота, обычного клиента и убедись, что все работает правильно.

Помни, что message бывают разных типов и не всегда содержат «:«

package com.javarush.task.task30.task3008.client;

import com.javarush.task.task30.task3008.ConsoleHelper;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class BotClient extends Client {
    public class BotSocketThread extends Client.SocketThread{
        @Override
        protected void clientMainLoop() throws IOException, ClassNotFoundException {
            BotClient.this.sendTextMessage("Привет чатику. Я бот. Понимаю команды: дата, день, месяц, год, время, час, минуты, секунды.");
            super.clientMainLoop();
        }

        @Override
        protected void processIncomingMessage(String message) {
            ConsoleHelper.writeMessage(message);
            String[] text = message.split(": ");
            SimpleDateFormat simpleDateFormat = null;
            switch (text[1]) {
                case "дата":
                    simpleDateFormat = new SimpleDateFormat("d.MM.YYYY");
                    break;
                case "день":
                    simpleDateFormat = new SimpleDateFormat("d");
                    break;
                case "месяц":
                    simpleDateFormat = new SimpleDateFormat("MMMM");
                    break;
                case "год":
                    simpleDateFormat = new SimpleDateFormat("YYYY");
                    break;
                case "время":
                    simpleDateFormat = new SimpleDateFormat("H:mm:ss");
                    break;
                case "час":
                    simpleDateFormat = new SimpleDateFormat("H");
                    break;
                case "минуты":
                    simpleDateFormat = new SimpleDateFormat("m");
                    break;
                case "секунды":
                    simpleDateFormat = new SimpleDateFormat("s");
                    break;
            }
            if(simpleDateFormat != null)
                sendTextMessage(String.format("Информация для %s: %s", text[0], simpleDateFormat.format(Calendar.getInstance().getTime())));
        }
    }

    @Override
    protected String getUserName() {
        return String.format("date_bot_%d", (int)(Math.random() * 100));
    }

    @Override
    protected boolean shouldSendTextFromConsole() {
        return false;
    }

    @Override
    protected SocketThread getSocketThread() {
        return new BotSocketThread();
    }

    public static void main(String[] args) {
        new BotClient().run();
    }
}
  • ,

level13.lesson11.home03 - не проходит проверку

Программа работает, но не проходит проверку. Условие задачи:
  1. Считать с консоли имя файла.
  2. Вывести в консоль(на экран) содержимое файла.
  3. Не забыть освободить ресурсы. Закрыть поток чтения с файла и поток ввода с клавиатуры.

Вот мой код:

package com.javarush.task.task13.task1318;

import java.io.*;

/*
Чтение файла
*/

public class Solution {
    public static void main(String[] args) throws IOException {
        // напишите тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String fileName = reader.readLine();

        InputStream fis = new FileInputStream(fileName);

        while (fis.available() > 0) {
            System.out.print((char)fis.read());
        }
        fis.close();
        reader.close();

    }
}
  • ,

package com.javarush.task.task20.task2025 Не проходит валидацию

Условие:

Алгоритмы-числа
Число S состоит из M цифр, например, S=370 и M (количество цифр) = 3
Реализовать логику метода getNumbers, который должен среди натуральных чисел меньше N (long)
находить все числа, удовлетворяющие следующему критерию:
число S равно сумме его цифр, возведенных в M степень
getNumbers должен возвращать все такие числа в порядке возрастания.

Пример искомого числа:
370 = 3*3*3 + 7*7*7 + 0*0*0
8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8

На выполнение дается 10 секунд и 50 МБ памяти.


Может какойто хитрый подход есть или я не так что-то сделал, или просто валидатор не принимает из-за полнолуния, может кто-то ткнёт меня на ошибку? :(

package com.javarush.task.task20.task2025;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
Алгоритмы-числа
*/


public class Solution {
    public static void main(String[] args) {
        long a = System.currentTimeMillis();
        long[] y = getNumbers(Integer.MAX_VALUE);
        long b = System.currentTimeMillis();
        System.out.println("Time: " + (b - a) / 1000 + " seconds " + ((b - a) % 1000) + " ms");
        System.out.println("Memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024 / 1024 + " mb");
        System.out.println(y.length);
        for(long i : y) {
            System.out.print(i + ", ");
        }
    }

    public static long[] getNumbers(long N) {
        // Init power array
        final int NUMBERS = 9;
        final int SQRT = 10;
        int[][] power = new int[NUMBERS + 1][SQRT + 1];
        for(int i = 0; i <= NUMBERS; i++) {
            int temp = i;
            power[i][1] = temp;
            for(int j = 2; j <= SQRT; j++) {
                temp *= i;
                power[i][j] = temp;
            }
        }
        List<Integer> armstrong = new ArrayList<>();
        for(int i = 0; i < N; i++) {
            if(i < 0) break;
            // All 1-digit numbers are armstrong's numbers
            if(i > 9) {
                int n = i;
                int last;
                int prev;
                int degree = 1;
                boolean shouldVerify = true;

                // Verifying that every digit is less or equals next one
                // And calculate digits number
                while(n > 9) {
                    degree++;
                    last = n % 10;
                    n /= 10;
                    prev = n % 10;

                    if(last == 0) {
                        last = 10;
                    }

                    if(prev == 0) {
                        prev = 10;
                    }

                    if(last < prev) {
                        shouldVerify = false;
                        break;
                    }
                }

                if(!shouldVerify)
                    continue;

                // Calculate sum of powered digits
                int m = i;
                int sum = 0;
                while(m > 0) {
                    sum += power[m % 10][degree];
                    m /= 10;
                }

                if(sum == i && !armstrong.contains(sum)) {
                    armstrong.add(i);
                }
                else {
                    // Verify if calculated sum is armstrong number
                    int checksum = 0;
                    int checkdegree = 0;
                    int k = sum;
                    while(k > 0) {
                        checkdegree++;
                        k /= 10;
                    }

                    int l = sum;
                    while(l > 0) {
                        checksum += power[l % 10][checkdegree];
                        l /= 10;
                    }

                    if(sum == checksum && !armstrong.contains(sum)) {
                        armstrong.add(sum);
                    }
                }
            }
            else {
                armstrong.add(i);
            }
        }

        // Convert List with armstrong numbers to array
        long[] result = new long[armstrong.size()];
        for(int i = 0; i < armstrong.size(); i++) {
            result[i] = armstrong.get(i);
        }
        Arrays.sort(result);
        return result;
    }
}

  • ,

com.javarush.task.task19.task1918

Условие:

Знакомство с тегами
Считайте с консоли имя файла, который имеет HTML-формат.

Пример:
Info about Leela <span xml:lang=»en» lang=»en»><b><span>Turanga Leela
</span></b></span><span>Super</span><span>girl</span>


Первым параметром в метод main приходит тег. Например, «span«.
Вывести на консоль все теги, которые соответствуют заданному тегу.
Каждый тег на новой строке, порядок должен соответствовать порядку следования в файле.
Количество пробелов, n, r не влияют на результат.
Файл не содержит тег CDATA, для всех открывающих тегов имеется отдельный закрывающий тег, одиночных тегов нет.

Тег может содержать вложенные теги.

Пример вывода:
<span xml:lang="en" lang="en"><b><span>Turanga Leela</span></b></span>
<span>Turanga Leela</span>
<span>Super</span>
<span>girl</span>


Шаблон тега:
<tag>text1</tag>
<tag text2>text1</tag>
<tag
text2>text1</tag>
text1, text2 могут быть пустыми


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

package com.javarush.task.task19.task1918;

/*
Знакомство с тегами
*/

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) throws Exception {
        String openTag = "<" + args[0].toLowerCase();
        String closeTag = "</" + args[0].toLowerCase() + ">";
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String file = bufferedReader.readLine();
        bufferedReader.close();
        BufferedReader bufferedContentReader = new BufferedReader(new FileReader(file));
        StringBuilder stringContentBuilder = new StringBuilder();
        while(bufferedContentReader.ready()) {
            stringContentBuilder.append(bufferedContentReader.readLine());
            stringContentBuilder.append(System.getProperty("line.separator"));
        }
        bufferedContentReader.close();
        String content = stringContentBuilder.toString().toLowerCase();
        Map<Integer, String> map = new TreeMap<>();
        for(int i = 0; i < content.length(); i++) {
            if(content.charAt(i) == '<' && (content.substring(i, i + openTag.length() + 1).equals(openTag + " ") || content.substring(i, i + openTag.length() + 1).equals(openTag + ">"))) {
                map.put(i, openTag);
            }
            else if(content.charAt(i) == '<' && content.substring(i, i + closeTag.length()).equals(closeTag)) {
                map.put(i + closeTag.length(), closeTag);
            }
        }
        int count = 0;
        boolean tag = false;
        int indexStart = 0;
        for(Map.Entry<Integer, String> pair : map.entrySet()) {
            if(pair.getValue().equals(openTag) && !tag) {
                indexStart = pair.getKey();
                tag = true;
            }
            else if(tag && pair.getValue().equals(openTag)) {
                count++;
            }
            else if(pair.getValue().equals(closeTag) && count != 0) {
                count--;
            }
            else if(pair.getValue().equals(closeTag) && count == 0) {
                tag = false;
                System.out.println(content.substring(indexStart, pair.getKey()));
            }
        }
    }
}

Баг валидатора задачи com.javarush.task.task33.task3303

Имеется следующая задача:
Десериализация JSON объекта
НЕОБХОДИМО: подключенные библиотеки Jackson Core, Bind и Annotation версии 2.6.1

В метод convertFromJsonToNormal первым параметром приходит имя файла, который содержит один ДЖЕЙСОН объект.
Вторым параметром приходит имя класса, объект которого находится в файле.
Метод convertFromJsonToNormal должен вычитать объект из файла, преобразовать его из JSON и вернуть.

Вариант решения 1:
public static <T> T convertFromJsonToNormal(String fileName, Class<T> clazz) throws IOException {
        return new ObjectMapper().readValue(new FileReader(fileName), clazz);
    }

Результат:
Задача не прошла тестирование!
— Объект возвращаемый методом convertFromJsonToNormal должен быть получен с помощью метода readValue класса ObjectMapper.

Вариант решения 2:
public static <T> T convertFromJsonToNormal(String fileName, Class<T> clazz) throws IOException {
        FileReader reader = new FileReader(fileName);
        ObjectMapper mapper = new ObjectMapper();

        return mapper.readValue(reader, clazz);
    }

Результат:
Задача не прошла тестирование!
— В методе convertFromJsonToNormal должен быть создан объект типа ObjectMapper с помощью конструктора без параметров.
— Объект возвращаемый методом convertFromJsonToNormal должен быть получен с помощью метода readValue класса ObjectMapper.

PS. Используемая версия Jackson — 2.8.5

task.task09.task0924 не понял условие задачи и не проходит проверку

Собственно, заголовок

package com.javarush.task.task09.task0924;

import java.util.ArrayList;

/* 
Страшная сказка
*/

public class Solution {

public static LittleRedRidingHood hood = new LittleRedRidingHood();
public static Grandmother grandmother = new Grandmother();
public static Patty patty = new Patty();
public static Woodman woodman = new Woodman();
public static Wolf wolf = new Wolf();

public static void main(String[] args) {
    Wolf.ate.add(grandmother);
    Wolf.ate.add(hood);
    Woodman.killed.add(wolf);
    
}

//красная шапочка
public static class LittleRedRidingHood extends StoryItem {
}

//бабушка
public static class Grandmother extends StoryItem {
}

//пирожек
public static class Patty extends StoryItem {
}

//дровосек
public static class Woodman extends StoryItem {
}

//волк
public static class Wolf extends StoryItem {
}

public static abstract class StoryItem {
    public static ArrayList<StoryItem> killed = new ArrayList<StoryItem>();
    public static ArrayList<StoryItem> ate = new ArrayList<StoryItem>();
}
}

В чем суть задания? Если суть задания в добавлении объектов в листы killed и ate в соответствии с сюжетом сказки, то почему задание не проходит проверку ни по одному из пунктов?
x: Метод main должен изменить состояние (внутренние переменные) объекта волк wolf и woodman, пирожки никто не ел, волк чуток поел, а потом волка убили.

Считаем кол-во слов world - ПРОШУ ПОМОЩИ

Ни в какую не хочет проходить тест((( В чем моя ошибка? Вот код с заданием:
package com.javarush.test.level19.lesson05.task02;

/* Считаем слово
Считать с консоли имя файла.
Файл содержит слова, разделенные знаками препинания.
Вывести в консоль количество слов "world", которые встречаются в файле.
Закрыть потоки. Не использовать try-with-resources
*/

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


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

        int counter = 0;

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fileReader = new BufferedReader(new FileReader(reader.readLine()));

        String[] words = fileReader.readLine().split("\\W+");

        for (int i = 0; i < words.length; i++) {
            if ("world".equals(words[i])) {
                counter++;
            }
        }

        System.out.println(counter);

        reader.close();
        fileReader.close();
    }
}

level18.lesson10.bonus02 не проходит тестирование

Ребята, прошу помощи! По моему мнению программа выполняется корректно, не могу сообразить где ошибка, валидатор не хочет принимать задачу!(
package com.javarush.test.level18.lesson10.bonus02;

/* Прайсы
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
*/

import java.io.*;
import java.util.Locale;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws Exception {
        String action = args[0];
        String productName = args[1];
        String price = args[2];
        String quantity = args[3];
        Scanner scanner = new Scanner(System.in);
        String fileName = scanner.next();
        scanner.close();
        File file = new File(fileName);
        if (action.equals("-c")) {
            add(file, productName, price, quantity);
        }
    }

    static void add(File file, String productName, String price, String quantity) {
        try {
            int id = 0;
            Scanner fileNameScanner = new Scanner(file);
            while (fileNameScanner.hasNextLine()) {
                int curID = Integer.parseInt(fileNameScanner.nextLine().substring(0, 8).trim());
                if  (curID > id){
                    id = curID;
                }
            }
            fileNameScanner.close();
            PrintWriter printWriter = new PrintWriter(new FileOutputStream(file, true));
            printWriter.printf(Locale.US,"%n%-8d%-30s%-8s%s", id + 1, productName, price, quantity);
            printWriter.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }
}
  • ,

package com.javarush.task.task16.task1627;

Здравствуйте! Решаю задачку на 16-ом уровне. Валидтаор не принимает:
package com.javarush.task.task16.task1627;

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static void main(String[] args) throws InterruptedException {
        OnlineGame onlineGame = new OnlineGame();
        onlineGame.start();
    }

    public static class OnlineGame extends Thread {
        public static volatile boolean isWinnerFound = false;

        public static List<String> steps = new ArrayList<String>();

        static {
            steps.add("Начало игры");
            steps.add("Сбор ресурсов");
            steps.add("Рост экономики");
            steps.add("Убийство врагов");
        }

        protected Gamer gamer1 = new Gamer("Ivanov", 3);
        protected Gamer gamer2 = new Gamer("Petrov", 1);
        protected Gamer gamer3 = new Gamer("Sidorov", 5);

        public void run() {
            gamer1.start();
            gamer2.start();
            gamer3.start();

            while (!isWinnerFound) {
            }
            gamer1.interrupt();
            gamer2.interrupt();
            gamer3.interrupt();
        }
    }

    public static class Gamer extends Thread {
        private int rating;

        public Gamer(String name, int rating) {
            super(name);
            this.rating = rating;
        }

        @Override
        public void run() {
            //Add your code here - добавь код тут
            try
            {
                while (!OnlineGame.isWinnerFound)
                {
                    int i;
                    for (i = 0; i < OnlineGame.steps.size(); i++)
                    {
                        System.out.println(getName() + ":" + OnlineGame.steps.get(i));
                        Thread.sleep(1000/rating);
                    }
                    if (i == OnlineGame.steps.size())
                    {
                        System.out.println(getName() + ":победитель!");
                        OnlineGame.isWinnerFound = true;
                    }
                }
            }

            catch (Exception e)
            {
                System.out.println(getName() + ":проиграл");
            }
        }
    }
}

  • ,

level30.lesson04.home01

Подскажите пожалуйста, что не так
package com.javarush.test.level30.lesson04.home01;

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;

/* Экономим время
1. Создайте Producer и Consumer (См. комментарий к методу main)
2. Создайте методы toString, equals и hashCode в классе ShareItem. Для этого в теле класса ShareItem выполни:
2.1. Alt+Enter -> toString() -> Enter
2.2. Alt+Enter -> equals() and hashCode() -> click all 'Next'-s
3. В Producer и Consumer реализуйте метод run так, чтобы вызов метода interrupt прерывал работу consumer и producer трэдов

4. Реализация метода run для Producer:
4.1. Используя метод offer добавить в очередь 9 ShareItem-ов с такими параметрами: ("ShareItem-N", N), где N - номер элемента от 1 до 9
4.2. Перед каждым добавлением вывести фразу "Элемент 'ShareItem-N' добавлен". Используйте System.out.format
4.3. Усыпить трэд на 0.1 секунды
4.4. Если у очереди есть Consumer, не занятый работой, то вывести фразу "Consumer в ожидании!".
Просмотрите методы интерфейса TransferQueue, там есть нужный метод.

5. Реализация метода run для Consumer:
5.1. Усыпить трэд на 0.5 секунды
5.2. В бесконечном цикле заберите элемент из очереди методом take и выведите в консоль "Processing item.toString()".

6. Сверьте вывод с файлом output.txt
7. Стек-трейс не выводите в консоль
*/
public class Solution {
    /*
    1. Создайте класс Producer. Для этого на красном имени класса нажмите Alt+Enter -> Create Class ...
    2. Станьте на имени аргумента в конструкторе (queue) и нажмите Alt+Enter -> Create Field for Parameter 'queue' -> Enter -> Enter
    3. Станьте на подчеркнутой строке - описании класса. Далее Alt+Enter -> Implement Methods -> Enter
    4. Проделайте п.1-3 для класса Consumer
     */

    public static void main(String[] args) throws InterruptedException {
        TransferQueue<ShareItem> queue = new LinkedTransferQueue<>();

        Thread producer = new Thread(new Producer(queue));
        Thread consumer = new Thread(new Consumer(queue));
        producer.start();
        consumer.start();

        Thread.sleep(1500);

        producer.interrupt();
        consumer.interrupt();
    }

}


package com.javarush.test.level30.lesson04.home01;

import java.util.concurrent.TransferQueue;

/**
 * 4. Реализация метода run для Producer:
 4.1. Используя метод offer добавить в очередь 9 ShareItem-ов с такими параметрами: ("ShareItem-N", N), где N - номер элемента от 1 до 9
 4.2. Перед каждым добавлением вывести фразу "Элемент 'ShareItem-N' добавлен". Используйте System.out.format
 4.3. Усыпить трэд на 0.1 секунды
 4.4. Если у очереди есть Consumer, не занятый работой, то вывести фразу "Consumer в ожидании!".
 Просмотрите методы интерфейса TransferQueue, там есть нужный метод.
 */
public class Producer implements Runnable {
    private TransferQueue<ShareItem> queue;

    public Producer(TransferQueue<ShareItem> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()){
            try {
                for(int i = 1; i < 10; i++) {
                    ShareItem item = new ShareItem("SahredItem-" + i, i);
                    System.out.format("Элемент '%s' добавлен%n", item.description);
                    queue.offer(item);
                }
                Thread.currentThread().sleep(100);
                if(queue.hasWaitingConsumer()){
                    System.out.println("Consumer в ожидании!");
                }
            } catch (InterruptedException e) {

            }
        }
    }
}


package com.javarush.test.level30.lesson04.home01;

import java.util.concurrent.TransferQueue;

/**
 * 5. Реализация метода run для Consumer:
 5.1. Усыпить трэд на 0.5 секунды
 5.2. В бесконечном цикле заберите элемент из очереди методом take и выведите в консоль "Processing item.toString()".
 */
public class Consumer implements Runnable {
    private TransferQueue<ShareItem> queue;

    public Consumer(TransferQueue<ShareItem> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()){
            try {
                Thread.currentThread().sleep(500);
                while (true) {
                    ShareItem item = queue.take();
                    System.out.println("Processing " + item.toString());
                }
            } catch (InterruptedException e) {

            }
        }
    }
}


package com.javarush.test.level30.lesson04.home01;

//this class shows how to call other constructors using 'this'
public class ShareItem {
    public String description;
    public int itemId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ShareItem item = (ShareItem) o;

        if (itemId != item.itemId) return false;
        return description != null ? description.equals(item.description) : item.description == null;
    }

    @Override
    public int hashCode() {
        int result = description != null ? description.hashCode() : 0;
        result = 31 * result + itemId;
        return result;
    }

    @Override
    public String toString() {
        return "ShareItem{" +
                "description='" + description + '\'' +
                ", itemId=" + itemId +
                '}';
    }

    public ShareItem() {
        this("Test Item", 0);
    }

    public ShareItem(String description) {
        this(description, 0);
    }

    public ShareItem(int itemId) {
        this("Test Item", itemId);
    }

    public ShareItem(String description, int itemId) {
        this.description = description;
        this.itemId = itemId;
    }

    public String getDescription() {
        return description;
    }

    public int getItemId() {
        return itemId;
    }
}
  • ,

level30.lesson04.home01

Подскажите пожалуйста, что не так
package com.javarush.test.level30.lesson04.home01;

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;

/* Экономим время
1. Создайте Producer и Consumer (См. комментарий к методу main)
2. Создайте методы toString, equals и hashCode в классе ShareItem. Для этого в теле класса ShareItem выполни:
2.1. Alt+Enter -> toString() -> Enter
2.2. Alt+Enter -> equals() and hashCode() -> click all 'Next'-s
3. В Producer и Consumer реализуйте метод run так, чтобы вызов метода interrupt прерывал работу consumer и producer трэдов

4. Реализация метода run для Producer:
4.1. Используя метод offer добавить в очередь 9 ShareItem-ов с такими параметрами: ("ShareItem-N", N), где N - номер элемента от 1 до 9
4.2. Перед каждым добавлением вывести фразу "Элемент 'ShareItem-N' добавлен". Используйте System.out.format
4.3. Усыпить трэд на 0.1 секунды
4.4. Если у очереди есть Consumer, не занятый работой, то вывести фразу "Consumer в ожидании!".
Просмотрите методы интерфейса TransferQueue, там есть нужный метод.

5. Реализация метода run для Consumer:
5.1. Усыпить трэд на 0.5 секунды
5.2. В бесконечном цикле заберите элемент из очереди методом take и выведите в консоль "Processing item.toString()".

6. Сверьте вывод с файлом output.txt
7. Стек-трейс не выводите в консоль
*/
public class Solution {
    /*
    1. Создайте класс Producer. Для этого на красном имени класса нажмите Alt+Enter -> Create Class ...
    2. Станьте на имени аргумента в конструкторе (queue) и нажмите Alt+Enter -> Create Field for Parameter 'queue' -> Enter -> Enter
    3. Станьте на подчеркнутой строке - описании класса. Далее Alt+Enter -> Implement Methods -> Enter
    4. Проделайте п.1-3 для класса Consumer
     */

    public static void main(String[] args) throws InterruptedException {
        TransferQueue<ShareItem> queue = new LinkedTransferQueue<>();

        Thread producer = new Thread(new Producer(queue));
        Thread consumer = new Thread(new Consumer(queue));
        producer.start();
        consumer.start();

        Thread.sleep(1500);

        producer.interrupt();
        consumer.interrupt();
    }

}


package com.javarush.test.level30.lesson04.home01;

import java.util.concurrent.TransferQueue;

/**
 * 4. Реализация метода run для Producer:
 4.1. Используя метод offer добавить в очередь 9 ShareItem-ов с такими параметрами: ("ShareItem-N", N), где N - номер элемента от 1 до 9
 4.2. Перед каждым добавлением вывести фразу "Элемент 'ShareItem-N' добавлен". Используйте System.out.format
 4.3. Усыпить трэд на 0.1 секунды
 4.4. Если у очереди есть Consumer, не занятый работой, то вывести фразу "Consumer в ожидании!".
 Просмотрите методы интерфейса TransferQueue, там есть нужный метод.
 */
public class Producer implements Runnable {
    private TransferQueue<ShareItem> queue;

    public Producer(TransferQueue<ShareItem> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()){
            try {
                for(int i = 1; i < 10; i++) {
                    ShareItem item = new ShareItem("SahredItem-" + i, i);
                    System.out.format("Элемент '%s' добавлен%n", item.description);
                    queue.offer(item);
                }
                Thread.currentThread().sleep(100);
                if(queue.hasWaitingConsumer()){
                    System.out.println("Consumer в ожидании!");
                }
            } catch (InterruptedException e) {

            }
        }
    }
}


package com.javarush.test.level30.lesson04.home01;

import java.util.concurrent.TransferQueue;

/**
 * 5. Реализация метода run для Consumer:
 5.1. Усыпить трэд на 0.5 секунды
 5.2. В бесконечном цикле заберите элемент из очереди методом take и выведите в консоль "Processing item.toString()".
 */
public class Consumer implements Runnable {
    private TransferQueue<ShareItem> queue;

    public Consumer(TransferQueue<ShareItem> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()){
            try {
                Thread.currentThread().sleep(500);
                while (true) {
                    ShareItem item = queue.take();
                    System.out.println("Processing " + item.toString());
                }
            } catch (InterruptedException e) {

            }
        }
    }
}


package com.javarush.test.level30.lesson04.home01;

//this class shows how to call other constructors using 'this'
public class ShareItem {
    public String description;
    public int itemId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ShareItem item = (ShareItem) o;

        if (itemId != item.itemId) return false;
        return description != null ? description.equals(item.description) : item.description == null;
    }

    @Override
    public int hashCode() {
        int result = description != null ? description.hashCode() : 0;
        result = 31 * result + itemId;
        return result;
    }

    @Override
    public String toString() {
        return "ShareItem{" +
                "description='" + description + '\'' +
                ", itemId=" + itemId +
                '}';
    }

    public ShareItem() {
        this("Test Item", 0);
    }

    public ShareItem(String description) {
        this(description, 0);
    }

    public ShareItem(int itemId) {
        this("Test Item", itemId);
    }

    public ShareItem(String description, int itemId) {
        this.description = description;
        this.itemId = itemId;
    }

    public String getDescription() {
        return description;
    }

    public int getItemId() {
        return itemId;
    }
}
  • ,

Не проходит тестирование level10.lesson11.home09

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

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


/* Одинаковые слова в списке
Ввести с клавиатуры в список 20 слов. Нужно подсчитать количество одинаковых слов в списке.
Результат нужно представить в виде словаря Map<String, Integer>, где первый параметр – уникальная строка,
а второй – число, сколько раз данная строка встречалась в списке.
Вывести содержимое словаря на экран.
В тестах регистр (большая/маленькая буква) влияет на результат.
*/

public static Map<String, Integer> countWords(ArrayList<String> list)
    {
        HashMap<String, Integer> result = new HashMap<String, Integer>();

        //напишите тут ваш код
        for(String s : list)
        {
            int count = 0;
            if(!result.containsKey(s))
            {
                for (String s1 : list)
                {
                    if(s.equals(s1))
                    {
                        count++;
                    }
                }
            }
            if (count > 1)
            {
                result.put(s, count);
            }
        }
        return result;
    }