Всем привет.
Задачка решилась, всё делает по условию, но терзают меня смутные сомнения... Я в прошлой задаче(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();
}
}