Всем привет. Задачка решилась, всё делает по условию, но терзают меня смутные сомнения... Я в прошлой задаче(15) столкнулся с ситуацией когда валидатор не принимал из за того, что в 10-ом задании при создании синглтона для класса AdvertisementStorage сделал не через идею, использовал вариант из инета, на 10-том он проканал. Позже валик спохватился и не принимал уже другую задачу из за этого самого синглтона. Хотя он сделан был корректно, прото не так как накрутил себе программист валидатора. Думается мне, что я опять попал на те же грабли. Но может быть и ошибка где-то в методах, что мало вероятно, но может... Прозьба всем кто прошёл данный пункт, скинуть мне все классы программы кроме DirectorTablet и StatisticManager, в которых мы, собственно, в этой части изменения вносили. Хочу попробывать менять по одному все классы пока не пройдёт.(в прошлый раз только это помогло, а так, искал бы до седых волос) И ещё в классе DirectorTablet находятся закоменченные дополнительные данные, для теста сортировок. П.С. javarush, вы так хорошо продвинулись в смене интерфейса хелпа... Если б вы ещё так же резво перенесли все темы со старых, цены б вам не было... Странно видеть себя первым кто отважился задать вопрос по этой задаче. УСЛОВИЯ И ТРЕБОВАНИЯ: Ресторан(16) Реализуем первый пункт статистики — какую сумму заработали на рекламе, сгруппировать по дням. 1. В классе VideoSelectedEventDataRow создай геттер для поля amount. В классе CookedOrderEventDataRow создай геттер для поля cookName. 2. В StatisticManager создай метод (придумать самостоятельно), который из хранилища достанет все данные, относящиеся к отображению рекламы, и посчитает общую прибыль за каждый день. Дополнительно добавь вспомогательный метод get в класс хранилища, чтобы получить доступ к данным. 3. Начнем с логики метода printAdvertisementProfit в классе DirectorTablet. Используя метод из предыдущего пункта вывести в консоль в убывающем порядке даты и суммы. Для каждой даты из хранилища событий, для которой есть показанная реклама, должна выводится сумма прибыли за показы рекламы для этой даты. В конце вывести слово Total и общую сумму. Пример: 14-May-2013 - 2.50 13-May-2013 - 1.02 12-May-2013 - 543.98 Total - 547.50 4.Реализуем второй пункт статистики — загрузка (рабочее время) повара, сгруппировать по дням. В StatisticManager создай метод (придумать самостоятельно), который из хранилища достанет все данные, относящиеся к работе повара, и посчитает общую продолжительность работы для каждого повара отдельно. 5. Реализуем логику метода printCookWorkloading в классе DirectorTablet. Используя метод из предыдущего пункта вывести в консоль в убывающем порядке даты, имена поваров и время работы в минутах (округлить в большую сторону). Для каждой даты из хранилища событий, для которой есть запись о работе повара, должна выводится продолжительность работы в минутах для этой даты. Если повар не работал в какой-то из дней, то с пустыми данными его НЕ выводить (см. 13-May-2013) Поваров сортировать по имени Пример: 14-May-2013 vanov - 60 min Petrov - 35 min 13-May-2013 Ivanov - 129 min 12-May-2013 Ivanov - 6 min Petrov - 5 min Требования: 1. В классе VideoSelectedEventDataRow должен быть создан геттер для поля amount. 2. В классе CookedOrderEventDataRow должен быть создан геттер для поля cookName. 3. Метод printAdvertisementProfit класса DirectorTablet должен быть реализован в соответствии с условием задачи. 4. Метод printCookWorkloading класса DirectorTablet должен быть реализован в соответствии с условием задачи.
package com.javarush.task.task27.task2712.statistic;

import com.javarush.task.task27.task2712.ad.Advertisement;
import com.javarush.task.task27.task2712.kitchen.Cook;
import com.javarush.task.task27.task2712.statistic.event.CookedOrderEventDataRow;
import com.javarush.task.task27.task2712.statistic.event.EventDataRow;
import com.javarush.task.task27.task2712.statistic.event.EventType;
import com.javarush.task.task27.task2712.statistic.event.VideoSelectedEventDataRow;


import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by Mozg on 10.09.2017.
 */
public class StatisticManager {
    private static StatisticManager ourInstance = new StatisticManager();
    private StatisticStorage statisticStorage = new StatisticStorage();
    private Set<Cook> cooks = new HashSet<>();

    public static StatisticManager getInstance() {
        return ourInstance;
    }

    private StatisticManager() {
    }
    //посчитает общую продолжительность работы для каждого повара отдельно
    public Map<Date, Map<String, Double>> cookJopDonePerDay(){
        SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        Map<EventType, List<EventDataRow>> storageMap = statisticStorage.getStorage();
        Map<String, Map<String, Double>> result = new HashMap<>();
        List<EventDataRow> listRow = new ArrayList<>(storageMap.get(EventType.COOKED_ORDER));
        for (EventDataRow x: listRow){
            CookedOrderEventDataRow date = (CookedOrderEventDataRow) x;
            if (!result.containsKey(format.format(date.getDate()))) {
                Map<String, Double> coocWork = new TreeMap<>();
                coocWork.put(date.getCookName(), (double)date.getTime());
                result.put(format.format(date.getDate()), coocWork);
            }else {
                Map<String, Double> coocWork = result.get(format.format(date.getDate()));
                if (!coocWork.containsKey(date.getCookName())) {
                    coocWork.put(date.getCookName(), (double) date.getTime());
                    result.put(format.format(date.getDate()), coocWork);
                }
                else {
                    double sum = coocWork.get(date.getCookName())+date.getTime();
                    coocWork.put(date.getCookName(),sum);
                    result.put(format.format(date.getDate()), coocWork);
                }
            }
        }
        Map<Date, Map<String, Double>> result1 = new TreeMap<>(Collections.reverseOrder());
        for (Map.Entry<String, Map<String, Double>> s: result.entrySet()) {
            result1.put(new Date(s.getKey()), s.getValue());
        }
        return result1;
    }

    //посчитает общую прибыль за каждый день.
    public Map<Date, Double> profitPerDey() {
        SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        Map<EventType, List<EventDataRow>> storageMap = statisticStorage.getStorage();
        List<EventDataRow> storeList = storageMap.get(EventType.SELECTED_VIDEOS);
        Map<String, Double> result = new TreeMap<>(Collections.reverseOrder());
        String date = null;
        double count = 0;
        for (EventDataRow s: storeList) {
            //double count = 0;
            if (date==null)date= format.format(s.getDate());
            if (date.equals(format.format(s.getDate())))
                count += ((VideoSelectedEventDataRow) s).getAmount();
            else {
                count = 0;
                date = format.format(s.getDate());
            }
            result.put(date, count);
        }
        Map<Date, Double> result1 = new TreeMap<>(Collections.reverseOrder());
        for (Map.Entry<String, Double> s: result.entrySet()) {
            result1.put(new Date(s.getKey()), s.getValue());
        }
        return result1;
    }

    // будет регистрировать событие в хранилище.
    public void register(EventDataRow data){
        statisticStorage.put(data);
    }

    private class StatisticStorage {

        Map<EventType, List<EventDataRow>> storage = new HashMap<>();

        public StatisticStorage() {
            for (EventType s: EventType.values()) {
                storage.put(s, new ArrayList<EventDataRow>());
            }
        }

        private void put(EventDataRow data){
            List<EventDataRow> list = storage.get(data.getType());
            list.add(data);
            storage.put(data.getType(), list);
        }

        public Map<EventType, List<EventDataRow>> getStorage() {
            return storage;
        }
    }
    public void register(Cook cook){
        cooks.add(cook);
    }

}
package com.javarush.task.task27.task2712;

import com.javarush.task.task27.task2712.statistic.StatisticManager;


import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by Mozg on 11.09.2017.
 */
public  class DirectorTablet {
StatisticManager manager = StatisticManager.getInstance();
    //Разпечатка с базы прибыли по дням
    public void printAdvertisementProfit(){
        SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        Map<Date, Double> advertisementProfitList = manager.profitPerDey();
//        advertisementProfitList.put(new Date(new Date().getYear(),4,28),new Double(300));
//        advertisementProfitList.put(new Date(new Date().getYear(),4,23),new Double(300));
//        advertisementProfitList.put(new Date(new Date().getYear(),4,21),new Double(300));
//        advertisementProfitList.put(new Date(new Date().getYear(),4,29),new Double(300));
//        advertisementProfitList.put(new Date(new Date().getYear(),4,24),new Double(300));
        double total = 0;
        for (Map.Entry<Date, Double> s: advertisementProfitList.entrySet()) {
            ConsoleHelper.writeMessage(format.format(s.getKey())+" - "+s.getValue()/100);
            total+=s.getValue()/100;
        }
        ConsoleHelper.writeMessage("Total - "+total);
    }
    //Разпечатка нагрузки поваров минут в день
    public void printCookWorkloading(){
        SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
        Map<Date, Map<String, Double>> dateMap = manager.cookJopDonePerDay();

//        Map<String, Double> map1 = new TreeMap<>(Collections.reverseOrder());
//        map1.put("Ivanov", (double) 480);
//        map1.put("Petrov", (double) 1375);
//        map1.put("Mozg", (double) 1158);
//
//        Map<String, Double> map2 = new TreeMap<>(Collections.reverseOrder());
//        map2.put("Svanov", (double) 480);
//        map2.put("Getrov", (double) 1375);
//        map2.put("Aozg", (double) 1158);
//
//        Map<String, Double> map3 = new TreeMap<>(Collections.reverseOrder());
//        map3.put("Svanov", (double) 480);
//        map3.put("Getrov", (double) 1375);
//        map3.put("Aozg", (double) 1158);
//
//        dateMap.put((new Date(new Date().getYear(),4,28)),map1);
//        dateMap.put((new Date(new Date().getYear(),4,29)),map2);
//        dateMap.put((new Date(new Date().getYear(),4,27)),map2);
        for (Map.Entry<Date,Map<String, Double>> s: dateMap.entrySet()) {
            ConsoleHelper.writeMessage(format.format(s.getKey()));
            for (Map.Entry<String, Double> x: s.getValue().entrySet()) {
                ConsoleHelper.writeMessage(x.getKey()+" - "+Math.round(x.getValue()/60)+" min");
            }
            ConsoleHelper.writeMessage("");
        }
    }
    public void printActiveVideoSet() {}
    public void printArchivedVideoSet(){}
}
CookedOrderEventDataRow
package com.javarush.task.task27.task2712.statistic.event;
import com.javarush.task.task27.task2712.kitchen.Dish;
import com.javarush.task.task27.task2712.statistic.StatisticManager;

import java.util.Date;
import java.util.List;

/**
 * Created by Mozg on 10.09.2017.
 */
public class CookedOrderEventDataRow implements EventDataRow {
    private String tabletName;           //имя планшета
    private String cookName;             //имя повара
    private int cookingTimeSeconds;      //время приготовления заказа в секундах
    private List<Dish> cookingDishs;     //список блюд для приготовления
    private Date currentDate;

    public CookedOrderEventDataRow(String tabletName, String cookName,
        int cookingTimeSeconds, List<Dish> cookingDishs) {
        this.tabletName = tabletName;
        this.cookName = cookName;
        this.cookingTimeSeconds = cookingTimeSeconds;
        this.cookingDishs = cookingDishs;
        currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.COOKED_ORDER;
    }

    @Override
    public Date getDate() {
        return currentDate;
    }

    @Override
    public int getTime() {
        return cookingTimeSeconds;
    }

    public String getCookName() {
        return cookName;
    }
}
VideoSelectedEventDataRow
package com.javarush.task.task27.task2712.statistic.event;

import com.javarush.task.task27.task2712.ad.Advertisement;

import java.util.Date;
import java.util.List;

/**
 * Created by Mozg on 10.09.2017.
 */
 public class VideoSelectedEventDataRow implements EventDataRow {
    private List<Advertisement> optimalVideoSet;    //список видео-роликов, отобранных для показа
    private long amount;                             // сумма денег в копейках
    private int totalDuration;                      //общая продолжительность показа отобранных рекламных роликов
    private Date currentDate;

    public VideoSelectedEventDataRow(List<Advertisement> optimalVideoSet, long amount, int totalDuration) {
        this.optimalVideoSet = optimalVideoSet;
        this.amount = amount;
        this.totalDuration = totalDuration;
        currentDate = new Date();
    }

    @Override
    public EventType getType() {
        return EventType.SELECTED_VIDEOS;
    }

    @Override
    public Date getDate() {
        return currentDate;
    }

    @Override
    public int getTime() {
        return totalDuration;
    }

    public long getAmount() {
        return amount;
    }
}
ConsoleHelper
package com.javarush.task.task27.task2712;

import com.javarush.task.task27.task2712.kitchen.Dish;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Mozg on 06.09.2017.
 */
public class ConsoleHelper {
    //для вывода message в консоль
    public static void writeMessage(String message){
        System.out.println(message);
    }
    //для чтения строки с консоли.
    public static String readString() throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
           return reader.readLine();
    }
    //просит пользователя выбрать блюдо и добавляет его в список.
    public static List<Dish> getAllDishesForOrder() throws IOException {
        List<Dish> orderList = new ArrayList<>();
        ConsoleHelper.writeMessage(Dish.allDishesToString());
        ConsoleHelper.writeMessage("Введите название блюда, для выхода - exit");
        label:while (true){
            String dish = readString();
            //Проверяем не набрал ли пользователь exit если набрал выходим.
            if (dish.equalsIgnoreCase("exit")){
                if (orderList.size()>=1) {
                    ConsoleHelper.writeMessage("Заказ принят");
                    return orderList;
                }else if (orderList.isEmpty()){
                    break;
                }
            }
            //Если поле пустое или не состветствует никакому блюду просим уточнить заказ
            if (!Dish.allDishesToString().contains(dish)||dish.isEmpty()) {
                ConsoleHelper.writeMessage("Такого блюда нету. Повторите ввод");
                continue label;
            }
            orderList.add(Dish.valueOf(dish));
        }
        return orderList;
    }
}
EventDataRow
package com.javarush.task.task27.task2712.statistic.event;

import java.util.Date;

/**
 * Created by Mozg on 10.09.2017.
 */
public interface EventDataRow {

    EventType getType();
    Date getDate();
    int getTime();
}
EventType
package com.javarush.task.task27.task2712.statistic.event;

/**
 * Created by Mozg on 10.09.2017.
 */
public enum EventType {
    COOKED_ORDER,
    SELECTED_VIDEOS,
    NO_AVAILABLE_VIDEO;
}
Restaurant
package com.javarush.task.task27.task2712;

import com.javarush.task.task27.task2712.ad.AdvertisementManager;

import com.javarush.task.task27.task2712.kitchen.Cook;
import com.javarush.task.task27.task2712.kitchen.Waiter;

import java.io.IOException;

/**
 * Created by Mozg on 06.09.2017.
 */
public class Restaurant {
    public static void main(String[] args) throws IOException {
        DirectorTablet directorTablet = new DirectorTablet();
        Waiter waiter = new Waiter();
        //Создаём наблюдаемый обьект
        Tablet tablet = new Tablet(5);
        //Сщздаём наблюдатель
        Cook cook = new Cook("Amigo");
        //Добавляем наблюдаемый обьект к наблюдателю
        tablet.addObserver(cook);
        cook.addObserver(waiter);
        tablet.createOrder();
        directorTablet.printActiveVideoSet();
        directorTablet.printAdvertisementProfit();
        directorTablet.printArchivedVideoSet();
        directorTablet.printCookWorkloading();
    }
}