Ресторан(16)

  • 32
  • Недоступна
Реализуем первый пункт статистики - какую сумму заработали на рекламе, сгруппировать по дням. 1. В классе VideoSelectedEventDataRow создай геттер для поля amount. В классе CookedOrderEventDataRow создай геттер для поля cookName. 2. В StatisticManager создай метод (придумать самостоятельно), которы
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (185)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Михаил 31 уровень
25 февраля, 12:48
С первой попытки. Мелочь, а приятно) Случайно наткнулся на упоминание метода descendingMap() класса TreeMap. Очень удобно для сортировки в обратном порядке.
Vadim 31 уровень
22 февраля, 23:09
2 дня, 24 попытки, долго пришлось искать, где формируется ошибка. Валидатор ранее где-то принял неверное решение, возможно в 10 задаче, потому что она у меня решилась относительно легко, если сравнивать с комментариями других. В этой задаче докопался до того, что ошибка прилетала из класса AdvertisementManager метода public void processVideos() в последней строке метода
StatisticManager.getInstance().register(new VideoSelectedEventDataRow(storage.list(), amount, timeSeconds));
Неправильно высчитывалась amount до этого. Надеюсь, дальше уже не будет таких проблем. Кстати, метод пока все еще без рекурсии
cavc 31 уровень, Санкт-Петербург
22 февраля, 16:19
Все сделал и все равно не принимал. После 2 часов мучений не выдержал и заглянул в ответы. начал сравнивать. все верно одинаково по логике и выводу на экран, но все равно не принимает валидатор. Не выдержал и скопипастил.
Судариков Ярослав 33 уровень, Москва
15 февраля, 13:12
2 дня боли и страданий из-за 3 и 4 красных пунктов. Забил, и скопипастил правильное решение через кнопку в идее. Как же я удивился, что последний пункт так и остался красным))))) В общем откатил всё до своего решения, еще часик взрыва мозга, и в итоге проблема оказалась в том, что я выводил выручку от рекламы в копейках вместо рублей, и в выводе о работе поваров не дописал " min" . Товарищи будьте внимательнее, и жить станет гораздо проще :)
tbcarus 33 уровень, Москва
4 февраля, 21:05
Умучился, так и не нашёл ошибку. Весь алгоритм довольно понятен, написал его относительно быстро, вывод соответствует требованию, перебор рекламы в 10 задаче был через рекурсивный метод, я его тогда несколько раз перепроверял - работает верно. Но 3 и 4 пункт валидатор упорно браковал. Перечитал все комментарии, перепроверил все прочитанные косяки, но валидатор непреклонен. На этом уровне несколько часов тестировал задачу в разных вариантах - вывод по заданию. Помог только ctrl+C - ctrl+V.
Анатолий 32 уровень
29 января, 17:58
У кого проблемы с 3 пунктом при валидации. Что я только не пробовал, тесты - шместы - вывод идеальный. Вернулся к 10 задаче переделал всё в рекурсию и т.д. Не прошло. В итоге подсмотрел на гитхабе решение. Заработало. Разбирал логику. Без принципиальной разницы. Возможна проблема в том, мапу с какими типами мы передаём. Для передачи из СтатистикМенеджера в ДиректорТаблет надо использовать TreeMap<String, Double>, где дата переведена в String а сумма в Double (я использовал HashMap<Date, Long>, т.е. те типы которые шли изначально в статистике). Причём 4 пункт прошёл сразу, и там я использовал типы из статистики HashMap<Date, Map<String, Integer>>, его переделывать не пришлось... 2010
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)); - если же нет - то просто помещаем во вложенную мапу новую пару
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) - после цикла вывожу на экран общую сумму
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());
alex_us 41 уровень, Симферополь
29 января, 10:50
2008. с 3 попытки) Ну что сказать)) обожаю это чувство триумфа когда смог решить)) Ресторан наверное самая интересная цепочка задач за весь курс. Не требует знаний невероятных , но заставляет усиленно думать все время , и прослеживать цепочку событий всю . Сначала когда первый раз дошел до 16 задачи не мог вообще сообразить как же мне работать с мапой в мапе. Но спустя пару недель вернулся и спокойно за час решил)) как то все устаканивается в голове и спустя время решается проще и яснее