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
8 changes: 8 additions & 0 deletions .idea/.gitignore

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

13 changes: 13 additions & 0 deletions .idea/compiler.xml

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

7 changes: 7 additions & 0 deletions .idea/encodings.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/jarRepositories.xml

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

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

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.

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

## Автор решения
Разнодумова Виктория Алексеевна

## Описание реализации
1. Проект содержит 3 класса (Main - для запуска приложения, Report - для генерации отчетов и работы с ними, Order - для хранения и парсинга заказов) и 2 перечисления (OrderStatuses - для хранения состояний заказов, Months - для обработки месяцев).
2. В начале работы программа считывает содержимое файла format.json и преобразует его в массив JSON, который передается в статический метод parseOrders() класса Order, который хранит данные каждого заказа после парсинга. Метод parseOrders() принимает массив JSON, и для каждого его объекта преобразует поля в удобный для работы формат. Поле status хранится в виде перечислений OrderStatuses. Метод возвращает список типа Order.
3. Создаём новый отчёт - объект класса Report для поиска месяца с наибольшими тратами. Для формирования отчёта используется функция generateMaxTotalMonthReport(), возвращающая строку в формате JSON.
4. Внутри функции создаётся словарь totalForMonths, который будет хранить месяц и сумму заказов. Затем начинаем итерироваться по всем заказам из нашего списка заказов и выполняем проверку на статус. Если он соответствует COMPLETED, то для него получаем месяц. Далее проверяем, был ли месяц уже добавлен в наш словарь. Если да, то для суммарного значения переменной double totalForMonth берём уже записанное в словарь значение, в противном случае присваиваем переменной 0.0. В результате обновляем наш словарь: добавляем в него пару ключу - текущий месяц, значение - старое значение totalForMonth из словаря плюс поле total текущего объекта Order, которое получаем с помощью гетэра.
5. Далее выполняется поиск максимального значения суммы total. Проходимся по всем значениям из словаря totalForMonths и сравниваем их с максимальным maxTotal, который проинициализирован значением Double.MIN_VALUE. Таким образом получаем максимальное значение.
6. Создаём список всех месяцев maxTotalForMonths, для которых сумма оказалась равна найденному maxTotal. Если найдено несколько месяцев, то необходимо обеспечить вывод в порядке их следования в течение года. Для этого проходим по значениям перечисления Months и проверяем, была ли в указанный месяц максимальная сумма. Если да, то преобразуем значение из Months в строку и добавляем в список.
7. В конце создаём объект JSON и добавляем в него найденные значения. Таким образом, функция generateMaxTotalMonthReport() возвращает строку в формате JSON, которая в классе Main выводится на экран.
## Инструкция по сборке и запуску решения
Для запуска необходим maven-сборщик с официального сайта.
1. В командной строке необходимо прописать команду для копирования репозитория: git clone https://github.com/victoriaraznodumova/school2024-test-task1.git
2. В корневой директории проекта нужно прописать команду для сборки проекта: mvn clean package
3. Команда для запуска приложения: mvn exec:java

## Инструкция по сборке и запуску решения
27 changes: 27 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>test-task1</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>



<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240303</version>
</dependency>
</dependencies>

</project>
24 changes: 24 additions & 0 deletions src/main/java/org/example/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.example;

import org.json.*;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class Main {
public static void main(String[] args) {
try {
String jsonString = new String(Files.readAllBytes(Paths.get("format.json")));
JSONArray jsonArray = new JSONArray(jsonString);
List<Order> orders = Order.parseOrders(jsonArray);
Report maxMonthReport = new Report(orders);
System.out.println(maxMonthReport.generateMaxTotalMonthReport());
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (JSONException e) {
throw new RuntimeException();
}
}
}
16 changes: 16 additions & 0 deletions src/main/java/org/example/Months.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.example;

public enum Months {
JANUARY,
FEBRUARY,
MARCH,
APRIL,
MAY,
JUNE,
JULY,
AUGUST,
SEPTEMBER,
OCTOBER,
NOVEMBER,
DECEMBER;
}
50 changes: 50 additions & 0 deletions src/main/java/org/example/Order.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.example;

import org.json.*;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class Order {
private String userId;
private LocalDate orderedAt;
private OrderStatuses status;
private double total;

public Order(String userId, LocalDate orderedAt, OrderStatuses status, double total) {
this.userId = userId;
this.orderedAt = orderedAt;
this.status = status;
this.total = total;
}
public String getUserId() {
return userId;
}
public OrderStatuses getStatus(){
return status;
}
public LocalDate getOrderedAt() {
return orderedAt;
}
public double getTotal() {
return total;
}

public static List<Order> parseOrders(JSONArray jsonArray) {
List<Order> orders = new ArrayList<>();
for (int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String userId = jsonObject.getString("user_id");
LocalDate orderedAt = LocalDate.parse(jsonObject.getString("ordered_at").substring(0, 10));
OrderStatuses status = OrderStatuses.valueOf(jsonObject.getString("status"));
double total = jsonObject.getDouble("total");
orders.add(new Order(userId, orderedAt, status, total));
} catch (JSONException e) {
e.printStackTrace();
}
}
return orders;
}
}
8 changes: 8 additions & 0 deletions src/main/java/org/example/OrderStatuses.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.example;

public enum OrderStatuses {
COMPLETED,
CANCELED,
CREATED,
DELIVERY;
}
43 changes: 43 additions & 0 deletions src/main/java/org/example/Report.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package org.example;

import org.json.JSONObject;

import java.time.Month;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Report {
List<Order> orders;
public Report( List<Order> orders){
this.orders = orders;
}

public String generateMaxTotalMonthReport() {
Map<String, Double> totalForMonths = new HashMap<>();
for (Order order : orders) {
if (order.getStatus() == OrderStatuses.COMPLETED) {
Month month = order.getOrderedAt().getMonth();
double totalForMonth = totalForMonths.getOrDefault(month.name().toLowerCase(), 0.0);
totalForMonths.put(month.name().toLowerCase(), totalForMonth + order.getTotal());
}
}
double maxTotal = Double.MIN_VALUE;
for (double total : totalForMonths.values()) {
maxTotal = Math.max(maxTotal, total);
}

List<String> maxTotalForMonths = new ArrayList<>();
for (Months month: Months.values()){
String monthString = month.toString().toLowerCase();
if (totalForMonths.containsKey(monthString) && totalForMonths.get(monthString) == maxTotal){
maxTotalForMonths.add(monthString);
}
}

JSONObject reportJson = new JSONObject();
reportJson.put("months", maxTotalForMonths);
return reportJson.toString();
}
}