Реализуем первый пункт статистики - какую сумму заработали на рекламе, сгруппировать по дням.
1. В классе VideoSelectedEventDataRow создай геттер для поля amount.
В классе CookedOrderEventDataRow создай геттер для поля cookName.
2. В StatisticManager создай метод (придумать самостоятельно), которы
Ресторан(16)
- 32
- Недоступна
Комментарии (185)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Михаил 31 уровень
25 февраля, 12:48
С первой попытки. Мелочь, а приятно)
Случайно наткнулся на упоминание метода descendingMap() класса TreeMap. Очень удобно для сортировки в обратном порядке.
0
Vadim 31 уровень
22 февраля, 23:09
2 дня, 24 попытки, долго пришлось искать, где формируется ошибка. Валидатор ранее где-то принял неверное решение, возможно в 10 задаче, потому что она у меня решилась относительно легко, если сравнивать с комментариями других.
В этой задаче докопался до того, что ошибка прилетала из класса AdvertisementManager метода public void processVideos() в последней строке метода
Неправильно высчитывалась amount до этого. Надеюсь, дальше уже не будет таких проблем. Кстати, метод пока все еще без рекурсии 0
cavc 31 уровень, Санкт-Петербург
22 февраля, 16:19
Все сделал и все равно не принимал. После 2 часов мучений не выдержал и заглянул в ответы. начал сравнивать. все верно одинаково по логике и выводу на экран, но все равно не принимает валидатор. Не выдержал и скопипастил.
0
Судариков Ярослав 33 уровень, Москва
15 февраля, 13:12
2 дня боли и страданий из-за 3 и 4 красных пунктов. Забил, и скопипастил правильное решение через кнопку в идее. Как же я удивился, что последний пункт так и остался красным)))))
В общем откатил всё до своего решения, еще часик взрыва мозга, и в итоге проблема оказалась в том, что я выводил выручку от рекламы в копейках вместо рублей, и в выводе о работе поваров не дописал " min" . Товарищи будьте внимательнее, и жить станет гораздо проще :)
0
tbcarus 33 уровень, Москва
4 февраля, 21:05
Умучился, так и не нашёл ошибку. Весь алгоритм довольно понятен, написал его относительно быстро, вывод соответствует требованию, перебор рекламы в 10 задаче был через рекурсивный метод, я его тогда несколько раз перепроверял - работает верно. Но 3 и 4 пункт валидатор упорно браковал. Перечитал все комментарии, перепроверил все прочитанные косяки, но валидатор непреклонен.
На этом уровне несколько часов тестировал задачу в разных вариантах - вывод по заданию. Помог только ctrl+C - ctrl+V.
0
Анатолий 32 уровень
29 января, 17:58
У кого проблемы с 3 пунктом при валидации.
Что я только не пробовал, тесты - шместы - вывод идеальный.
Вернулся к 10 задаче переделал всё в рекурсию и т.д. Не прошло.
В итоге подсмотрел на гитхабе решение. Заработало. Разбирал логику. Без принципиальной разницы.
Возможна проблема в том, мапу с какими типами мы передаём. Для передачи из СтатистикМенеджера в ДиректорТаблет надо использовать TreeMap<String, Double>, где дата переведена в String а сумма в Double (я использовал HashMap<Date, Long>, т.е. те типы которые шли изначально в статистике).
Причём 4 пункт прошёл сразу, и там я использовал типы из статистики HashMap<Date, Map<String, Integer>>, его переделывать не пришлось...
2010
0
alex_us 41 уровень, Симферополь
29 января, 11:27
Пункт 4 :
- аналогично пункту 2 , но только тут будет мапа вложенная в мапу. String key - : дата преобразованная в строку . Во вложенной мапе key - это имя повара, а value - это общее время его работы в этот день
TreeMap<String, TreeMap<String, Integer>> resultMap = new TreeMap<>(Collections.reverseOrder());
List<EventDataRow> events = statisticStorage.get(EventType.COOKED_ORDER);
- аналогично пункту 2 перебираем события , приводим тип, используем SimpleDateFormat.
- далее проверяем если ли уже такой ключ - дата в мапе или нет?
- если нет - то просто создаем сначала вложенную мапу
TreeMap<String, Integer> innerTreeMap = new TreeMap<>();
- помещаем в нее innerTreeMap.put(ev.getCookName(), ev.getTime() / 60);
важно обратить внимание что нужно разделить время из события на 60 , потому что нам требуется в минутах
- возвращем мапу из метода.
- если же такой ключ есть то мы :
- выделяем внутреннюю мапу TreeMap<String, Integer> innerTreeMap = resultMap.get(key);
- в ней перебираем имена поваров в innerTreeMap.keyset()
- если имя повара во вложенной мапе совпадает с именем повара из события то
приводим секунды к минутам и помещаем в мапу сумму предыдущего значения и времени из события
int cookMinutes = ev.getTime() / 60;
innerTreeMap.put(cook, cookMinutes + innerTreeMap.get(cook));
- если же нет - то просто помещаем во вложенную мапу новую пару
0
alex_us 41 уровень, Симферополь
29 января, 11:07
Пункт 3 :
- StatisticManager statisticManager = StatisticManager.getInstance();
получаем мапу из пункта 2 :
TreeMap<String, Long> treeMap = statisticManager.profitForEachDay();
- обьявил переменную double total =0; в которой хранится общая сумма за показы
- в цикле :
- перебираю строки дат в treeMap.keySet(
- прибавляю к общей сумме сумму из каждой даты
- вывожу на экран сумму за эту дату используя String.format("%s - %.2f", date, money)
- после цикла вывожу на экран общую сумму
0
alex_us 41 уровень, Симферополь
29 января, 11:03
Опишу свое решение , может быть кому то поможет:
Пункт 2 :
- создал в классе хранилища метод возвращающий список событий того типа который мы передали ему в параметрах.
- создал в методе TreeMap<String, Long>(Collections.reverseOrder()) В обратном порядке потому , что по условию нам надо будет по уменьшению выводить по датам.
- получил список событий просмотренных видео из хранилища
- Дальше в цикле перебираем все события
- внутри цикла приводим VideoSelectedEventDataRow ev = (VideoSelectedEventDataRow) event;
- дальше я преобразовал дату к строке путем создания обьекта SimpleDateFormat ("dd-MMM-yyyy", Locale.ENGLISH)
- проверяем , содержит ли наша treeMap дату которую извлекли из события и преобразовали к строке ранее.
- если да - то помещаем в мапу resultmap.put(data, resultMap.get(key) + ev.getAmount()) , где
resultMap.get(key) - это сумма которая хранилась по этому ключу ранее, а ev.getAmount() - это
сумма за показ рекламы извлеченная из нашего события
- если нет - то просто помещаем новую пару в мапу : resultMap.put(key, ev.getAmount());
0
alex_us 41 уровень, Симферополь
29 января, 10:50
2008. с 3 попытки)
Ну что сказать)) обожаю это чувство триумфа когда смог решить)) Ресторан наверное самая интересная цепочка задач за весь курс. Не требует знаний невероятных , но заставляет усиленно думать все время , и прослеживать цепочку событий всю . Сначала когда первый раз дошел до 16 задачи не мог вообще сообразить как же мне работать с мапой в мапе. Но спустя пару недель вернулся и спокойно за час решил)) как то все устаканивается в голове и спустя время решается проще и яснее
0