Всем привет, вопрос по задаче Меню ресторана:
Реализуем первый пункт статистики - какую сумму заработали на рекламе, сгруппировать по дням.
1. В классе VideoSelectedEventDataRow создай геттер для поля amount.
В классе CookedOrderEventDataRow создай геттер для поля cookName.
2. В StatisticManager создай метод (придумать самостоятельно), который из хранилища достанет все данные, относящиеся к отображению рекламы, и посчитает общую прибыль за каждый день.
Дополнительно добавь вспомогательный метод get в класс хранилища, чтобы получить доступ к данным.
3. Начнем с логики метода printAdvertisementProfit в классе DirectorTablet.
Используя метод из предыдущего пункта вывести в консоль в убывающем порядке даты и суммы.
Для каждой даты из хранилища событий, для которой есть показанная реклама, должна выводится сумма прибыли за показы рекламы для этой даты.
В конце вывести слово Total и общую сумму.
Пример:
14-Jul-2013 - 2.50
13-Jul-2013 - 1.02
12-Jul-2013 - 543.98
Total - 547.50
Сам решаю тоже через мапу, но застрял на том, как в обратном порядке вывести даты, которые хранятся в ключах с типом String. Заглянул в правильное решение, там делают так же, добавляют данные в HashMap, потом делают список из ключей, сортируют его - то есть если тип String, то сначала должны идти строки где дата меньше, например 12-Jul-2013 а потом 14-Jul-2013, а не наоборот, а потом проходятся по списку и печатают:
StatisticManager statisticManager = StatisticManager.getInstance();
Map<String, Long> profitMap = statisticManager.getProfitMap();
ArrayList<String> list = new ArrayList(profitMap.keySet());
Collections.sort(list);
for (String key : list) {
double amount = 1.0 * profitMap.get(key) / 100;
System.out.println(key + " - " + String.format(Locale.ENGLISH, "%.2f", amount));
}
Не хочу копировать решение, не могу протестировать. Протестировал просто создавая мапу с такими данными и отсортировывая, но там выводится наоборот, то есть 12-Jul-2013 13-Jul-2013 14-Jul-2013.
Подскажите пожалуйста, как происходит сортировка?))
Артем
41 уровень
Помогите кто может)
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Константин Программист 1С
2 марта 2022, 21:58
Ещё хочу добавить то, что в метод Collections.sort можно передать компаратор вторым параметром. Поэтому можно сразу отсортировать в нужном порядке. Например Collections.sort(myCollection, (o1, o2) -> логика сравнения);
0
Константин Программист 1С
2 марта 2022, 19:31
Приветствую!
Пример в вопросе из правильного решения? Затрудняюсь ответить почему в нём так написано, так как Collections.sort сортирует в обычном порядке, так как это описано в методе compareTo(обычно по возрастанию). По поводу того, как отсортировать коллекцию в обратном порядке. Существуют много способов, но основные это:
1) Вызвать
Collections.sort(myCollection) - обычная сортировка
Collections.reverse(myCollection) - меняет порядок элементов на противоположное(1 становится последним, 2 становится предпоследним и т.д.)
2) Через StreamAPI. Пример:
myCollection.Stream() - создание стрима(есть и другие способы создания, но на мой взгляд этот самый удобный)
.sorted(Comparator.reverseOrder) или .sorted((o1, o2) -> o2.compareTo(o1)) - сортировка в обратном порядке. Если (o1, o2) -> o2.compareTo(o1) и Comparator.reverseOrder вызывает вопросы, то рекомендую почитать про интерфейсы Comparator и Comparable, что такое лямбда выражения и анонимные классы
.collect(Collectors.toList()) - для получения коллекции, если она нужна
Или
.forEach(лямбда выражение) - для обработки результата без создания коллекции
Итог: myCollection.Stream().sorted(Comparator.reverseOrder).forEach(o -> o.myMethod());
0