Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions .idea/school2024-test-task1.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,26 @@
4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года.

## Автор решения

Дженбаз Артур Ринатович
## Описание реализации
Решение представлено на языке Java.

Для выполнения данного задания была использована библиотека JSON.simple, поскольку она предоставляет простой и понятный API для работы с JSON в Java.

Алгоритм работы метода _generateReport_ (метод формирования отчёта):
1. Чтение JSON-файла и парсинг данных в массив JSON-объектов (JSONArray). Таким образом, каждая покупка пользователя будет представлять JSON-объект, который в дальнейшем мы будем анализировать.
2. Создание списка месяцев в порядке их следования в течение года (для корректности вывода по условию задачи).
3. Создание Map для хранения суммы общих трат пользователей за каждый месяц. Ключами являются названия месяцев в нижнем регистре, а значениями - общая сумма трат в соответствующем месяце (изначально все значения равны 0). Используется LinkedHashMap для соблюдения порядка следования месяцев в течение года.
4. Обход JSON-массива и вычисление суммы трат пользователей за конкретный месяц. Цикл проходит через каждый заказ и проверяет его статус. Если статус заказа - "COMPLETED" (то есть заказ является завершенным), то мы считываем с заказа месяц и сумму покупки. Затем в Map по ключу полученного месяца мы добавляем сумму покупки к общей сумме трат за месяц.
5. Вычисление максимальной суммы трат за месяц и создание списка месяцев с такой суммой. В случае, если месяц с наибольшими тратами пользователей не один, то в список они записываются в порядке их следования в течение года.
6. Создание JSON-объекта с месяцами, имеющими максимальную сумму трат. В созданный JSON-объект помещается список месяцев с максимальной суммой трат. Затем метод преобразует этот JSON-объект в строку и возвращает её.

В результате выполнения кода мы получаем список месяцев, в которых была зафиксирована наибольшая сумма трат пользователей. В методе _main_ выводим этот список в формате JSON.
## Инструкция по сборке и запуску решения
1. Убедитесь, что на вашем компьютере установлена JDK;
2. Склонируйте репозиторий c проектом на свой локальный компьютер;
3. Откройте проект в IntelliJ IDEA;
4. Откройте папку src и перейдите в файл Main.java;
5. Запустите приложение.

При необходимости проверить другие входные данные измените содержимое файла _format.json_. Также можете добавить новый JSON-файл в папку с проектом и изменить название файла в переменной _filepath_ в _main_-методе.
Binary file added json-simple-1.1.1.jar
Binary file not shown.
79 changes: 79 additions & 0 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import org.json.simple.*;
import org.json.simple.parser.*;

import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.Month;
import java.util.*;

public class Main {

public static void main(String[] args) {

// JSON-файл
String filepath = String.valueOf(Paths.get("format.json"));
// Генерация отчета
String report = generateReport(filepath);
// Вывод отчета в консоль
System.out.println(report);
}

public static String generateReport(String filepath) {
try {

// Чтение файла и парсинг данных в массив json-объектов
JSONArray jsonArray = (JSONArray) new JSONParser().parse(new FileReader(filepath));

// Список месяцев в порядке их следования в течение года
List<String> orderedMonths = new ArrayList<>();
for (Month month : Month.values()) {
orderedMonths.add(month.toString().toLowerCase());
}

// Map для хранения общей суммы трат за каждый месяц
Map<String, Double> totalPerMonth = new LinkedHashMap<>();
for (String month : orderedMonths) {
totalPerMonth.put(month, 0.0);
}

// Вычисление общей суммы трат за месяц
for (Object order : jsonArray) {
JSONObject jsonOrder = (JSONObject) order;
// Учёт только завершенных заказов
if (!jsonOrder.get("status").equals("COMPLETED")) {
continue;
}

// Получение данных о покупке (месяце и сумме)
String orderedAt = jsonOrder.get("ordered_at").toString().substring(0, 10);
LocalDate date = LocalDate.parse(orderedAt);
String month = date.getMonth().toString().toLowerCase();
Double total = Double.parseDouble((String) jsonOrder.get("total"));
// Добавление суммы заказа к общей сумме трат за месяц
totalPerMonth.put(month, totalPerMonth.getOrDefault(month, 0.0) + total);
}

// Максимальная сумма трат за месяц
double maxTotal = Collections.max(totalPerMonth.values());
// Список месяцев с максимальной суммой трат
List<String> suitableMonths = new ArrayList<>();
for (Map.Entry<String, Double> entry : totalPerMonth.entrySet()) {
if (entry.getValue() == maxTotal) {
suitableMonths.add(entry.getKey());
}
}

// Создание JSON-объекта с месяцами с наибольшими тратами пользователей
JSONObject result = new JSONObject();
result.put("months", suitableMonths);
// Возврат строки в формате JSON
return result.toJSONString();
} catch (IOException | ParseException e) {
e.printStackTrace();
// Возврат пустого JSON-объекта в случае ошибки
return "{}";
}
}
}