• 0.12

  • -0.80

level26.lesson15.big01 задание 8 - не компилируется!

Дожили. Ладно бы не принимало, но НЕ КОМПИЛИРУЕТСЯ на сервере!!! Задача отрабатывает на все сто, я вот вообще не знаю, к чему можно придраться в плане исполнения. Что может быть? Если у Вас есть рабочий вариант и есть какие-то серьёзные отличия в реализации — пожалуйста, выкладывайте, буду примерять, потому что уже третий день буксую, надо дальше двигаться…

Выкладываю ВЕСЬ код, кроме пакета исключений.



****************************************************************
Задание 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.", если нет денег в банкомате.


package com.javarush.test.level26.lesson15.big01.command;

import com.javarush.test.level26.lesson15.big01.exception.InterruptOperationException;
import com.javarush.test.level26.lesson15.big01.exception.NotEnoughMoneyException;

/**
 * Created by promoscow on 21.02.17.
 */
interface Command {
    void execute() throws InterruptOperationException, NotEnoughMoneyException;
}


package com.javarush.test.level26.lesson15.big01.command;

import com.javarush.test.level26.lesson15.big01.Operation;
import com.javarush.test.level26.lesson15.big01.exception.InterruptOperationException;
import com.javarush.test.level26.lesson15.big01.exception.NotEnoughMoneyException;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by promoscow on 21.02.17.
 */
public final class CommandExecutor {
    private static Map<Operation, Command> commands = new HashMap<>();

    private CommandExecutor() {
    }

    static {
        commands.put(Operation.DEPOSIT, new DepositCommand());
        commands.put(Operation.EXIT, new ExitCommand());
        commands.put(Operation.INFO, new InfoCommand());
        commands.put(Operation.WITHDRAW, new WithdrawCommand());
    }

    public static final void execute(Operation operation) throws NotEnoughMoneyException, InterruptOperationException {
        if (commands.containsKey(operation)) {
            commands.get(operation).execute();
        }
    }
}


package com.javarush.test.level26.lesson15.big01.command;

import com.javarush.test.level26.lesson15.big01.ConsoleHelper;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulator;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulatorFactory;
import com.javarush.test.level26.lesson15.big01.exception.InterruptOperationException;
import com.javarush.test.level26.lesson15.big01.exception.NotEnoughMoneyException;

/**
 * Created by promoscow on 21.02.17.
 */
class DepositCommand implements Command {
    @Override
    public void execute() throws InterruptOperationException, NotEnoughMoneyException {

        String currencyCode = ConsoleHelper.askCurrencyCode();
        CurrencyManipulator manipulator = CurrencyManipulatorFactory.getManipulatorByCurrencyCode(currencyCode);
        String[] digits = ConsoleHelper.getValidTwoDigits();
        manipulator.addAmount(Integer.parseInt(digits[0]), Integer.parseInt(digits[1]));
    }
}


package com.javarush.test.level26.lesson15.big01.command;

/**
 * Created by promoscow on 21.02.17.
 */
class ExitCommand implements Command {
    @Override
    public void execute() {

    }
}


package com.javarush.test.level26.lesson15.big01.command;

import com.javarush.test.level26.lesson15.big01.ConsoleHelper;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulator;
import com.javarush.test.level26.lesson15.big01.CurrencyManipulatorFactory;

import java.util.Collection;

/**
 * Created by promoscow on 21.02.17.
 */
class InfoCommand implements Command {
    @Override
    public void execute() {
        Collection<CurrencyManipulator> collection = CurrencyManipulatorFactory.getAllCurrencyManipulators();
        boolean hasMoney = false;
        for (CurrencyManipulator currencyManipulator : collection) {
            hasMoney = (currencyManipulator.hasMoney() && currencyManipulator.getTotalAmount() != 0 || hasMoney);
            if (currencyManipulator.getTotalAmount() != 0) {
                ConsoleHelper.writeMessage(currencyManipulator.getCurrencyCode() + " - " + currencyManipulator.getTotalAmount());
            }
        }
        if (!hasMoney) ConsoleHelper.writeMessage("No money available.");
    }
}


package com.javarush.test.level26.lesson15.big01.command;

/**
 * Created by promoscow on 21.02.17.
 */
class WithdrawCommand implements Command {
    @Override
    public void execute() {

    }
}


package com.javarush.test.level26.lesson15.big01;

import com.javarush.test.level26.lesson15.big01.command.CommandExecutor;
import com.javarush.test.level26.lesson15.big01.exception.InterruptOperationException;
import com.javarush.test.level26.lesson15.big01.exception.NotEnoughMoneyException;

import java.util.Locale;

/**
 * Created by promoscow on 20.02.17.
 */
public class CashMachine {
    public static void main(String[] args) throws InterruptOperationException, NotEnoughMoneyException {
        Locale.setDefault(Locale.ENGLISH);
        Operation operation;
        do {
            operation = ConsoleHelper.askOperation();
            CommandExecutor.execute(operation);
        } while (!operation.equals(Operation.EXIT));
    }
}


package com.javarush.test.level26.lesson15.big01;

import com.javarush.test.level26.lesson15.big01.exception.InterruptOperationException;
import com.javarush.test.level26.lesson15.big01.exception.NotEnoughMoneyException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by promoscow on 20.02.17.
 */
public class ConsoleHelper {

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

    public static void writeMessage(String message) {
        System.out.println(message);
    }

    public static String readString() throws InterruptOperationException, NotEnoughMoneyException {

        String s = "";
        try {
            s = reader.readLine();
        } catch (IOException e) {

        }
        return s;
    }

    public static String askCurrencyCode() throws NotEnoughMoneyException, InterruptOperationException {
        writeMessage("ВВЕДИТЕ КОД ВАЛЮТЫ:");
        String currencyCode;
        while (true) {
            currencyCode = readString();
            if (isCorrectCurrency(currencyCode)) break;
            writeMessage("КОД ВАЛЮТЫ МОЖЕТ СОДЕРЖАТЬ 3 СИМВОЛА АНГЛИЙСКОГО АЛФАВИТА. ПОПРОБУЙТЕ ЕЩЁ РАЗ.");
        }
        return currencyCode.toUpperCase();
    }

    private static boolean isCorrectCurrency(String newNickname) {
        Pattern p = Pattern.compile("^[a-zA-Z]{3}$");
        Matcher m = p.matcher(newNickname);
        return m.matches();
    }

    public static String[] getValidTwoDigits() throws NotEnoughMoneyException, InterruptOperationException {
        writeMessage("ВВЕДИТЕ НОМИНАЛ И КОЛИЧЕСТВО БАНКНОТ (ЧЕРЕЗ ПРОБЕЛ):");
        String enter;
        while (true) {
            enter = readString();
            if (enter.matches("\\d+ \\d+")) break;
            writeMessage("НЕКОРРЕКТНЫЙ ВВОД. ВВЕДИТЕ НОМИНАЛ И КОЛ-ВО ВАЛЮТ.");
        }
        return enter.split(" ");
    }

    public static Operation askOperation() throws NotEnoughMoneyException, InterruptOperationException {
        Operation operation;
        while (true) {
            writeMessage("ВВЕДИТЕ КОД ОПЕРАЦИИ.");
            writeMessage("| INFO - 1 | DEPOSIT — 2 | WITHDRAW - 3 | EXIT - 4 |");
            try {
                operation = Operation.getAllowableOperationByOrdinal(Integer.valueOf(readString()));
                break;
            } catch (Exception e) {
                writeMessage("ДАННЫЕ НЕ ВЕРНЫ. ПОПРОБУЙТЕ ЕЩЁ РАЗ.");
            }
        }
        return operation;
    }
}


package com.javarush.test.level26.lesson15.big01;

import com.javarush.test.level20.lesson02.task05.Solution;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by promoscow on 20.02.17.
 */
public class CurrencyManipulator {
    public Map<Integer, Integer> denominations = new HashMap<>();
    private String currencyCode;

    public CurrencyManipulator(String currencyCode) {
        this.currencyCode = currencyCode;
    }

    public String getCurrencyCode() {
        return currencyCode;
    }

    public void addAmount(int denomination, int count) {
        if(denominations.containsKey(denomination)){
            denominations.put(denomination, denominations.get(denomination) + count);
        }else{
            denominations.put(denomination, count);
        }
    }

    public int getTotalAmount() {
        int count = 0;
        for (Map.Entry<Integer, Integer> entry : denominations.entrySet()) count += (entry.getKey() * entry.getValue());
        return count;
    }

    public boolean hasMoney() {
        return (!denominations.isEmpty());
    }
}


package com.javarush.test.level26.lesson15.big01;

        import java.util.Collection;
        import java.util.HashMap;
        import java.util.Map;

/**
 * Created by promoscow on 20.02.17.
 */
public final class CurrencyManipulatorFactory {
    private static Map<String, CurrencyManipulator> manipulators = new HashMap<>();

    private CurrencyManipulatorFactory() {
    }

    public static CurrencyManipulator getManipulatorByCurrencyCode(String currencyCode) {

        CurrencyManipulator result;
        if (manipulators.containsKey(currencyCode))
            result = manipulators.get(currencyCode);
        else {
            result = new CurrencyManipulator(currencyCode);
            manipulators.put(currencyCode, result);
        }
        return result;
    }


    public static Collection<CurrencyManipulator> getAllCurrencyManipulators () {
        return manipulators.values();
    }
}


package com.javarush.test.level26.lesson15.big01;

/**
 * Created by promoscow on 20.02.17.
 */
public enum Operation {
    INFO,
    DEPOSIT,
    WITHDRAW,
    EXIT;

    public static Operation getAllowableOperationByOrdinal(Integer i) {
        switch (i) {
            case 1:
                return INFO;
            case 2:
                return DEPOSIT;
            case 3:
                return WITHDRAW;
            case 4:
                return EXIT;
        }
        throw new IllegalArgumentException();
    }
}

Продление подписки для тех, кто решил доучиваться по старому курсу.

Вот я купил подписку в июне прошлого года. Годовую. Стало быть, в июне этого подписка закончится. По разным причинам, не все успевают пройти 40 уровней за год, это нормально.

Вышло обновление. Отлично. Разработчики дали возможность остаться на старой версии. Ещё лучше! Но, как мы знаем, версии не синхронизируются. Вот заканчивается у такого ученика (который остался на старой версии) курс, а он на 30-м уровне. По логике, ему не мешало бы дать возможность продлить подписку старой версии с сохранением прогресса.

Что скажете?

level20.lesson02.task03

package com.javarush.test.level20.lesson02.task03;

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

/* Знакомство с properties
В методе fillInPropertiesMap считайте имя файла с консоли и заполните карту properties данными из файла.
Про .properties почитать тут - http://ru.wikipedia.org/wiki/.properties
Реализуйте логику записи в файл и чтения из файла для карты properties.
*/
public class Solution {
    public static Map<String, String> properties = new HashMap<>();

    public static void main(String[] args) throws Exception {
        Solution solution = new Solution();
        solution.fillInPropertiesMap();
    }

    public void fillInPropertiesMap() throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name;
        while (((name = reader.readLine()) == null) || !(name.contains(".properties"))) System.out.println("enter file name with .properties extension");
        FileInputStream inputStream = new FileInputStream(name);
        load(inputStream);
        OutputStream outputStream = new FileOutputStream(name);
        save(outputStream);
        inputStream.close();
        outputStream.close();
        reader.close();
    }

    public void save(OutputStream outputStream) throws Exception {
        Properties props = new Properties();
        for (Map.Entry<String, String> entry : properties.entrySet()) props.setProperty(entry.getKey(), entry.getValue());    //наполняем массив Properties парами ключ-значение
        props.store(outputStream, null);    //выгружаем пары массива Properties в файл .properties
    }

    public void load(InputStream inputStream) throws Exception {
        Properties props = new Properties();
        props.load(inputStream);    //выгружаем Properties из файла .properties в массив
        for (Map.Entry<Object, Object> entry : props.entrySet()) properties.put(entry.getKey().toString(), entry.getValue().toString());    //заполняем статический массив из массива Properties
    }
}


Всё работает, но валидатор не принимает.

level20.lesson02.task03 — всё работает, но не принимает валидатор

package com.javarush.test.level20.lesson02.task03;

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

/* Знакомство с properties
В методе fillInPropertiesMap считайте имя файла с консоли и заполните карту properties данными из файла.
Про .properties почитать тут - http://ru.wikipedia.org/wiki/.properties
Реализуйте логику записи в файл и чтения из файла для карты properties.
*/
public class Solution {
    public static Map<String, String> properties = new HashMap<>();

    public void fillInPropertiesMap() throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name;
        while (((name = reader.readLine()) == null) || !(name.contains(".properties"))) System.out.println("enter file name with .properties extension");
        FileInputStream inputStream = new FileInputStream(name);
        load(inputStream);
        OutputStream outputStream = new FileOutputStream(name);
        save(outputStream);
        inputStream.close();
        outputStream.close();
        reader.close();
    }

    public void save(OutputStream outputStream) throws Exception {
        PrintWriter writer = new PrintWriter(outputStream);
        for (Map.Entry<String, String> entry : properties.entrySet()) writer.println(entry.getKey() + "=" + entry.getValue());
        writer.close();
    }

    public void load(InputStream inputStream) throws Exception {
        Properties props = new Properties();
        props.load(inputStream);
        for (Map.Entry<Object, Object> entry : props.entrySet()) properties.put(entry.getKey().toString(), entry.getValue().toString());
    }
}


всё отрабатывает отлично, менял разделитель ключа — значения в файле на: = «пробел»

level20.lesson02.task03 — всё работает, но не принимает валидатор

package com.javarush.test.level20.lesson02.task03;

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

/* Знакомство с properties
В методе fillInPropertiesMap считайте имя файла с консоли и заполните карту properties данными из файла.
Про .properties почитать тут - http://ru.wikipedia.org/wiki/.properties
Реализуйте логику записи в файл и чтения из файла для карты properties.
*/
public class Solution {
    public static Map<String, String> properties = new HashMap<>();

    public void fillInPropertiesMap() throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name;
        while (((name = reader.readLine()) == null) || !(name.contains(".properties"))) System.out.println("enter file name with .properties extension");
        FileInputStream inputStream = new FileInputStream(name);
        load(inputStream);
        OutputStream outputStream = new FileOutputStream(name);
        save(outputStream);
        inputStream.close();
        outputStream.close();
        reader.close();
    }

    public void save(OutputStream outputStream) throws Exception {
        PrintWriter writer = new PrintWriter(outputStream);
        for (Map.Entry<String, String> entry : properties.entrySet()) writer.println(entry.getKey() + "=" + entry.getValue());
        writer.close();
    }

    public void load(InputStream inputStream) throws Exception {
        Properties props = new Properties();
        props.load(inputStream);
        for (Map.Entry<Object, Object> entry : props.entrySet()) properties.put(entry.getKey().toString(), entry.getValue().toString());
    }
}


всё отрабатывает отлично, менял разделитель ключа — значения в файле на: = «пробел»

level20.lesson02.task03 — всё работает, но не принимает валидатор

package com.javarush.test.level20.lesson02.task03;

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

/* Знакомство с properties
В методе fillInPropertiesMap считайте имя файла с консоли и заполните карту properties данными из файла.
Про .properties почитать тут - http://ru.wikipedia.org/wiki/.properties
Реализуйте логику записи в файл и чтения из файла для карты properties.
*/
public class Solution {
    public static Map<String, String> properties = new HashMap<>();

    public void fillInPropertiesMap() throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name;
        while (((name = reader.readLine()) == null) || !(name.contains(".properties"))) System.out.println("enter file name with .properties extension");
        FileInputStream inputStream = new FileInputStream(name);
        load(inputStream);
        OutputStream outputStream = new FileOutputStream(name);
        save(outputStream);
        inputStream.close();
        outputStream.close();
        reader.close();
    }

    public void save(OutputStream outputStream) throws Exception {
        PrintWriter writer = new PrintWriter(outputStream);
        for (Map.Entry<String, String> entry : properties.entrySet()) writer.println(entry.getKey() + "=" + entry.getValue());
        writer.close();
    }

    public void load(InputStream inputStream) throws Exception {
        Properties props = new Properties();
        props.load(inputStream);
        for (Map.Entry<Object, Object> entry : props.entrySet()) properties.put(entry.getKey().toString(), entry.getValue().toString());
    }
}


всё отрабатывает отлично, менял разделитель ключа — значения в файле на: = «пробел»