• 0.00

  • 0.00

  • ,

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

CashMachine (8)

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

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

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

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

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

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

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

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

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

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

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

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

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

EUR — 200

USD — 120

Отлично!

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

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

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

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

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

task.task30.task3008

Помогите пожалуйста с задачей
Чат (11)

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

вспомогательные методы, написанные ранее. Реализуем метод void run() в классе Handler.

Он должен:

1. Выводить сообщение, что установлено новое соединение с удаленным адресом, который можно получить с помощью метода getRemoteSocketAddress.

2. Создавать Connection, используя поле socket.

3. Вызывать метод, реализующий рукопожатие с клиентом, сохраняя имя нового клиента.

4. Рассылать всем участникам чата информацию об имени присоединившегося участника (сообщение с типом USER_ADDED). Подумай, какой метод подойдет для этого лучше всего.

5. Сообщать новому участнику о существующих участниках.

6. Запускать главный цикл обработки сообщений сервером.

7. Обеспечить закрытие соединения при возникновении исключения.

8. Отловить все исключения типа IOException и ClassNotFoundException, вывести в консоль информацию, что произошла ошибка при обмене данными с удаленным адресом.

9. После того как все исключения обработаны, если п.11.3 отработал и возвратил нам имя, мы должны удалить запись для этого имени из connectionMap и разослать всем остальным участникам сообщение с типом USER_REMOVED и сохраненным именем.

10. Последнее, что нужно сделать в методе run() – вывести сообщение, информирующее что соединение с удаленным адресом закрыто.

Наш сервер полностью готов. Попробуй его запустить.


public class Server
{
    private static Map<String, Connection> connectionMap = new ConcurrentHashMap<>();
    public static void main(String[] args) throws IOException {
        int port = ConsoleHelper.readInt();


        try(ServerSocket serverSocket = new ServerSocket(port))
        {
            for (int i = 0;;i++)
            {
                ConsoleHelper.writeMessage("Сервер запущен.");
                Handler handler = new Handler(serverSocket.accept());
                handler.start();
            }
        }
        catch (Exception e)
        {
            ConsoleHelper.writeMessage("Ошибка сокета.");
        }
    }

    public static void sendBroadcastMessage(Message message)
    {
        try
        {
            for (Map.Entry<String, Connection> pair : connectionMap.entrySet()) {
                pair.getValue().send(message);
            }
        }
        catch (IOException e)
        {
            ConsoleHelper.writeMessage("Не могу отправить сообщение.");
        }
    }

    private static class Handler extends Thread
    {
        private Socket socket;

        public Handler(Socket socket)
        {
            this.socket = socket;
        }

        public void run()
        {
            ConsoleHelper.writeMessage("Established new connection with remote address " + socket.getRemoteSocketAddress());
            String clientName = null;

            try (Connection connection = new Connection(socket))
            {
                ConsoleHelper.writeMessage("Connection with port " + connection.getRemoteSocketAddress());

                clientName = serverHandshake(connection);

                sendBroadcastMessage(new Message(MessageType.USER_ADDED, clientName));

                sendListOfUsers(connection, clientName);

                serverMainLoop(connection, clientName);

            }
            catch (IOException | ClassNotFoundException e)
            {
                ConsoleHelper.writeMessage("An error occurred while communicating with the remote address");
            }
            finally
            {
                connectionMap.remove(clientName);
                sendBroadcastMessage(new Message(MessageType.USER_REMOVED, clientName));
            }

            ConsoleHelper.writeMessage(String.format("Connection with remote address (%s) is closed.", socket.getRemoteSocketAddress()));


        }

        private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
            String name = null;
            while (true) {
                connection.send(new Message(MessageType.NAME_REQUEST));
                Message message = connection.receive();
                if (message.getType() == MessageType.USER_NAME) {
                    name = message.getData();

                    if (!name.isEmpty() && !connectionMap.containsKey(name)) {
                        connectionMap.put(name, connection);
                        connection.send(new Message(MessageType.NAME_ACCEPTED));
                        return name;
                    }
                }
            }
        }

        private void sendListOfUsers(Connection connection, String userName)throws IOException
        {
            for (Map.Entry<String, Connection> pair : connectionMap.entrySet())
            {
                String name = pair.getKey();
                if (!name.equals(userName))
                {
                    connection.send(new Message(MessageType.USER_ADDED, name));
                }
            }
        }

        private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
            while (true)
            {
                Message message = connection.receive();
                if (message.getType() == MessageType.TEXT)
                {
                    String message1 = userName + ": " + message.getData();

                    Message message2 = new Message(MessageType.TEXT, message1);
                    sendBroadcastMessage(message2);
                }
                else
                {
                    ConsoleHelper.writeMessage("Error.");
                }
            }
        }

    }
}


Не принимает ни в какую. 37 попыток, валидатор агрится на эксепшены — «Метод run должен корректно обрабатывать исключения IOException и ClassNotFoundException.» Честно говоря, не понимаю что еще нужно написать, ни с проверками, ни с тру с ресурсами и без ресурсов не принимает. Подскажите, пожалуйста)
  • ,

level18.lesson10.home08

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/* Нити и байты
Читайте с консоли имена файлов, пока не будет введено слово "exit"
Передайте имя файла в нить ReadThread
Нить ReadThread должна найти байт, который встречается в файле максимальное число раз, и добавить его в словарь resultMap,
где параметр String - это имя файла, параметр Integer - это искомый байт.
Закрыть потоки. Не использовать try-with-resources
*/

public class Solution {
    public static Map<String, Integer> resultMap = new HashMap<String, Integer>();


    public static void main(String[] args) throws IOException, InterruptedException
    {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            String filename = reader.readLine();
            while (!filename.equals("exit"))
            {
                new ReadThread(filename).start();
                filename = reader.readLine();
            }

      /*  for (Map.Entry<String, Integer> pair : resultMap.entrySet())
        {
            System.out.println(pair.getKey() + " " + pair.getValue());
        }
    */


        reader.close();
    }

    public static class ReadThread extends Thread {

        String filename;
        public ReadThread(String fileName)
        {
            this.filename = fileName;

        }

        public void run()
        {
            try
            {
                Map <Integer, Integer> map = new HashMap<>();

                FileInputStream is = new FileInputStream(filename);

                int data = is.read();


                if (map.containsKey(data))
                {
                    map.put(data, map.get(data) + 1);
                }
                else
                {
                    map.put(data, 1);
                }
                
                is.close();

                int max = 0;

                for (Map.Entry<Integer, Integer> pair : map.entrySet())
                {

                    int key = pair.getKey();
                    int value = pair.getValue();

                    if (max < value)
                    {
                        max = value;
                    }

                    synchronized (resultMap)
                    {
                        resultMap.put(this.filename, key);
                    }

                }
            }
            catch (IOException e)
            {

            }
        }
    }
}

Друзья, помогите с задачей, выводит верно, валидатор не проходит. Потоки закрыты, hashmap синхронизирован, start вынес в main, но что-то неправильно, не могу понять что.
  • ,

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, NumberFormatException{

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String is1 = reader.readLine();
        String is2 = reader.readLine();



        BufferedReader reader1 = new BufferedReader(new FileReader(is1));

        FileWriter is = new FileWriter(is2);

        String[] result;


        result = reader1.readLine().split(" ");



        String x = "";

        
        for (int i = 0; i < result.length;i++ )
        {
            x += Math.round(Double.parseDouble(result[i])) + " ";
        }
        is.write(x.trim());


        reader1.close();
        is.close();

    }

}


Валидатор не принимает. Результат вроде выводит правильный, переписал без пробела в конце. Помогите пожалуйста, что не так в решении?