From 4beb538e040fcbd90fdd3509c3277f8a842a2443 Mon Sep 17 00:00:00 2001 From: Maksim Gurenkov Date: Sat, 27 Apr 2024 19:54:46 +0300 Subject: [PATCH 1/7] Upload solution (no refactoring) --- .gitignore | 38 ++++++ .idea/.gitignore | 8 ++ .idea/encodings.xml | 7 + .idea/misc.xml | 14 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + format.json => input.json | 0 pom.xml | 45 +++++++ src/main/java/application/Main.java | 29 ++++ src/main/java/data/Order.java | 19 +++ src/main/java/data/Status.java | 8 ++ .../java/utils/LocalDateTimeDeserializer.java | 27 ++++ src/main/java/utils/Report.java | 14 ++ src/main/java/utils/ReportGenerator.java | 42 ++++++ src/test/java/SampleTest.java | 0 15 files changed, 381 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml rename format.json => input.json (100%) create mode 100644 pom.xml create mode 100644 src/main/java/application/Main.java create mode 100644 src/main/java/data/Order.java create mode 100644 src/main/java/data/Status.java create mode 100644 src/main/java/utils/LocalDateTimeDeserializer.java create mode 100644 src/main/java/utils/Report.java create mode 100644 src/main/java/utils/ReportGenerator.java create mode 100644 src/test/java/SampleTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e5d6295 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/format.json b/input.json similarity index 100% rename from format.json rename to input.json diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cc5698e --- /dev/null +++ b/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + org.example + solution + 1.0-SNAPSHOT + + + 19 + 19 + UTF-8 + + + + + com.fasterxml.jackson.core + jackson-core + 2.16.1 + + + + com.fasterxml.jackson.core + jackson-annotations + 2.16.1 + + + + com.fasterxml.jackson.core + jackson-databind + 2.16.1 + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + \ No newline at end of file diff --git a/src/main/java/application/Main.java b/src/main/java/application/Main.java new file mode 100644 index 0000000..f3c83d5 --- /dev/null +++ b/src/main/java/application/Main.java @@ -0,0 +1,29 @@ +package application; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import data.Order; +import utils.ReportGenerator; + +import java.io.File; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.util.List; + +class Main { + public static void main(String[] args) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + List orders = objectMapper.readValue(new File("input.json"), new TypeReference>(){}); + System.out.println(ReportGenerator.generate(orders)); + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } +} + +// запись json +//ObjectMapper objectMapper = new ObjectMapper(); +//Car car = new Car("yellow", "renault"); +//objectMapper.writeValue(new File("target/car.json"), car); diff --git a/src/main/java/data/Order.java b/src/main/java/data/Order.java new file mode 100644 index 0000000..55b8124 --- /dev/null +++ b/src/main/java/data/Order.java @@ -0,0 +1,19 @@ +package data; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import lombok.Data; +import utils.LocalDateTimeDeserializer; + +import java.time.LocalDateTime; + +@Data +public class Order { + @JsonProperty("user_id") + private String userId; + @JsonProperty("ordered_at") + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime orderedAt; + private Status status; + private double total; +} diff --git a/src/main/java/data/Status.java b/src/main/java/data/Status.java new file mode 100644 index 0000000..f889418 --- /dev/null +++ b/src/main/java/data/Status.java @@ -0,0 +1,8 @@ +package data; + +public enum Status { + COMPLETED, + CANCELED, + CREATED, + DELIVERY +} diff --git a/src/main/java/utils/LocalDateTimeDeserializer.java b/src/main/java/utils/LocalDateTimeDeserializer.java new file mode 100644 index 0000000..e3107c3 --- /dev/null +++ b/src/main/java/utils/LocalDateTimeDeserializer.java @@ -0,0 +1,27 @@ +package utils; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +public class LocalDateTimeDeserializer extends StdDeserializer { + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); + public LocalDateTimeDeserializer() { + this(null); + } + + public LocalDateTimeDeserializer(Class vc) { + super(vc); + } + + @Override + public LocalDateTime deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException { + JsonNode node = jsonparser.getCodec().readTree(jsonparser); + String strDate = node.asText(); + return LocalDateTime.parse(strDate, formatter); + } +} diff --git a/src/main/java/utils/Report.java b/src/main/java/utils/Report.java new file mode 100644 index 0000000..24be97c --- /dev/null +++ b/src/main/java/utils/Report.java @@ -0,0 +1,14 @@ +package utils; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class Report { + @JsonProperty("months") + private List months; + + public Report(List months) { + this.months = months; + } +} diff --git a/src/main/java/utils/ReportGenerator.java b/src/main/java/utils/ReportGenerator.java new file mode 100644 index 0000000..25097b6 --- /dev/null +++ b/src/main/java/utils/ReportGenerator.java @@ -0,0 +1,42 @@ +package utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import data.Order; +import data.Status; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.*; + +public class ReportGenerator { + public static String generate(List orders) { + List maxMonths = new ArrayList<>(); + Map earningsForEachMonth = new HashMap<>(); + for (int i = 0; i < orders.size(); i ++) { + if (orders.get(i).getStatus() == Status.COMPLETED) { + String month = orders.get(i).getOrderedAt().getMonth().name(); + if (earningsForEachMonth.get(month) == null) { + earningsForEachMonth.put(month, orders.get(i).getTotal()); + } else { + earningsForEachMonth.put(month, earningsForEachMonth.get(month) + orders.get(i).getTotal()); + } + } + } + + double maxValue = Collections.max(earningsForEachMonth.values()); + for (Map.Entry entry : earningsForEachMonth.entrySet()) { + if (entry.getValue().equals(maxValue)) { + maxMonths.add(entry.getKey()); + } + } + + ObjectMapper objectMapper = new ObjectMapper(); + StringWriter output = new StringWriter(); + try { + objectMapper.writeValue(output, new Report(maxMonths)); + return output.toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/src/test/java/SampleTest.java b/src/test/java/SampleTest.java new file mode 100644 index 0000000..e69de29 From 52b0d21a1b1329f9f26c2266539c69af5000083f Mon Sep 17 00:00:00 2001 From: mkgurenkov <145710622+mkgurenkov@users.noreply.github.com> Date: Sat, 27 Apr 2024 19:58:51 +0300 Subject: [PATCH 2/7] Delete .idea directory --- .idea/.gitignore | 8 --- .idea/encodings.xml | 7 --- .idea/misc.xml | 14 ----- .idea/uiDesigner.xml | 124 ------------------------------------------- .idea/vcs.xml | 6 --- 5 files changed, 159 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffa..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index e5d6295..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From e5786599aeae515eb04105c2dcb5bb5b9c2b704b Mon Sep 17 00:00:00 2001 From: Maksim Gurenkov Date: Sun, 28 Apr 2024 23:55:30 +0300 Subject: [PATCH 3/7] Refactor and add build maven plugin --- dependency-reduced-pom.xml | 43 +++++++++++++++ input.json | 32 +++--------- pom.xml | 28 +++++++++- src/main/java/application/Main.java | 11 +--- .../java/{utils => application}/Report.java | 2 +- .../java/application/ReportGenerator.java | 52 +++++++++++++++++++ src/main/java/data/Order.java | 1 - src/main/java/utils/ReportGenerator.java | 42 --------------- src/main/resources/META-INF/MANIFEST.MF | 3 ++ 9 files changed, 134 insertions(+), 80 deletions(-) create mode 100644 dependency-reduced-pom.xml rename src/main/java/{utils => application}/Report.java (92%) create mode 100644 src/main/java/application/ReportGenerator.java delete mode 100644 src/main/java/utils/ReportGenerator.java create mode 100644 src/main/resources/META-INF/MANIFEST.MF diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 0000000..c2d3fe6 --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + org.example + solution + 1.0-SNAPSHOT + + + + maven-shade-plugin + 3.5.1 + + + package + + shade + + + + + application.Main + + + + + + + + + + + org.projectlombok + lombok + 1.18.30 + provided + + + + 19 + 19 + UTF-8 + + diff --git a/input.json b/input.json index 94aad31..6d404a7 100644 --- a/input.json +++ b/input.json @@ -1,38 +1,20 @@ [ { - "user_id": "3acfb0b7-04bd-4978-be4c-3929372277c1", - "ordered_at": "2023-01-16T13:56:39.492", - "status": "COMPLETED", - "total": "1917.00" - }, - { - "user_id": "25b003b9-ab22-4a24-a616-dd0303f983d8", - "ordered_at": "2023-03-05T08:34:21.123", - "status": "COMPLETED", - "total": "13990.00" - }, - { - "user_id": "e1470ada-fcbb-4424-8c46-065b6409ca4b", - "ordered_at": "2016-03-16T13:56:39.492", - "status": "COMPLETED", - "total": "215.50" - }, - { - "user_id": "081a47a5-b7bf-462c-a11a-68002a179152", - "ordered_at": "2023-12-08T21:36:59.281", + "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", + "ordered_at": "2023-12-14T11:15:31.108", "status": "COMPLETED", - "total": "49499.00" + "total": "500" }, { "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", - "ordered_at": "2023-12-14T11:10:29.408", + "ordered_at": "2023-12-14T11:15:31.108", "status": "CANCELED", - "total": "13650.00" + "total": "5000" }, { "user_id": "0999c6aa-1bac-4ded-9a54-92fff4f34d69", - "ordered_at": "2023-12-14T11:15:31.108", + "ordered_at": "2023-01-14T11:15:31.108", "status": "COMPLETED", - "total": "14760.00" + "total": "500" } ] \ No newline at end of file diff --git a/pom.xml b/pom.xml index cc5698e..cb48630 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ 19 UTF-8 + @@ -42,4 +43,29 @@ - \ No newline at end of file + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.1 + + + package + + shade + + + + + application.Main + + + + + + + + + + diff --git a/src/main/java/application/Main.java b/src/main/java/application/Main.java index f3c83d5..a5aa446 100644 --- a/src/main/java/application/Main.java +++ b/src/main/java/application/Main.java @@ -3,27 +3,18 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import data.Order; -import utils.ReportGenerator; - import java.io.File; import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZonedDateTime; import java.util.List; class Main { public static void main(String[] args) { ObjectMapper objectMapper = new ObjectMapper(); try { - List orders = objectMapper.readValue(new File("input.json"), new TypeReference>(){}); + List orders = objectMapper.readValue(new File("input.json"), new TypeReference<>(){}); System.out.println(ReportGenerator.generate(orders)); } catch (IOException e) { System.out.println(e.getMessage()); } } } - -// запись json -//ObjectMapper objectMapper = new ObjectMapper(); -//Car car = new Car("yellow", "renault"); -//objectMapper.writeValue(new File("target/car.json"), car); diff --git a/src/main/java/utils/Report.java b/src/main/java/application/Report.java similarity index 92% rename from src/main/java/utils/Report.java rename to src/main/java/application/Report.java index 24be97c..14c0fd4 100644 --- a/src/main/java/utils/Report.java +++ b/src/main/java/application/Report.java @@ -1,4 +1,4 @@ -package utils; +package application; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/application/ReportGenerator.java b/src/main/java/application/ReportGenerator.java new file mode 100644 index 0000000..61797cf --- /dev/null +++ b/src/main/java/application/ReportGenerator.java @@ -0,0 +1,52 @@ +package application; + +import com.fasterxml.jackson.databind.ObjectMapper; +import data.Order; +import data.Status; +import java.io.IOException; +import java.io.StringWriter; +import java.time.Month; +import java.util.*; + +public class ReportGenerator { + public static String generate(List orders) throws IOException { + Map earningsForEachMonth = countEarningsForEachMonth(orders); // Формируем мапу из списка всех заказов, ключом в которой + // является порядковый номер месяца, а значением - сумма потраченная в этот месяц + List maxMonths = findMonthsWithMaxEarnings(earningsForEachMonth); // Формируем список с месяцами, в которые совершались наибольшие затраты + + ObjectMapper objectMapper = new ObjectMapper(); + StringWriter output = new StringWriter(); + objectMapper.writeValue(output, new Report(maxMonths)); + return output.toString(); + } + + private static Map countEarningsForEachMonth(List orders) { + Map earningsForEachMonth = new TreeMap<>(); // Создаем TreeMap, так как тогда коллекция будет по умолчанию + // отсортированна по ключу в порядке возрастания (в нашем случае это означает, что месяца будут располагаться в порядке их следования в течение года) + for (int i = 0; i < orders.size(); i ++) { // проходимся по списку заказов + if (orders.get(i).getStatus() == Status.COMPLETED) { + int month = orders.get(i).getOrderedAt().getMonthValue(); + if (earningsForEachMonth.get(month) == null) { + earningsForEachMonth.put(month, orders.get(i).getTotal()); // если в мапе еще нет ни одного + // элемента с таким ключом, то кладем его туда, в качестве значения указываем сумму заказа + } else { + earningsForEachMonth.put(month, earningsForEachMonth.get(month) + orders.get(i).getTotal()); // если в мапе уже есть элемент с таким ключом, + // то прибавляем к значению в мапе сумму текущего заказа + } + } + } + return earningsForEachMonth; + } + + private static List findMonthsWithMaxEarnings(Map earningsForEachMonth) { + List maxMonths = new ArrayList<>(); + if (earningsForEachMonth.isEmpty()) {return maxMonths;} // если не проверить, то при вызове Collections.max() может вылететь ошибка + double maxValue = Collections.max(earningsForEachMonth.values()); + for (Map.Entry entry : earningsForEachMonth.entrySet()) { + if (entry.getValue().equals(maxValue)) { + maxMonths.add(Month.of(entry.getKey()).toString().toLowerCase()); + } + } + return maxMonths; + } +} \ No newline at end of file diff --git a/src/main/java/data/Order.java b/src/main/java/data/Order.java index 55b8124..9ccee84 100644 --- a/src/main/java/data/Order.java +++ b/src/main/java/data/Order.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import lombok.Data; import utils.LocalDateTimeDeserializer; - import java.time.LocalDateTime; @Data diff --git a/src/main/java/utils/ReportGenerator.java b/src/main/java/utils/ReportGenerator.java deleted file mode 100644 index 25097b6..0000000 --- a/src/main/java/utils/ReportGenerator.java +++ /dev/null @@ -1,42 +0,0 @@ -package utils; - -import com.fasterxml.jackson.databind.ObjectMapper; -import data.Order; -import data.Status; - -import java.io.IOException; -import java.io.StringWriter; -import java.util.*; - -public class ReportGenerator { - public static String generate(List orders) { - List maxMonths = new ArrayList<>(); - Map earningsForEachMonth = new HashMap<>(); - for (int i = 0; i < orders.size(); i ++) { - if (orders.get(i).getStatus() == Status.COMPLETED) { - String month = orders.get(i).getOrderedAt().getMonth().name(); - if (earningsForEachMonth.get(month) == null) { - earningsForEachMonth.put(month, orders.get(i).getTotal()); - } else { - earningsForEachMonth.put(month, earningsForEachMonth.get(month) + orders.get(i).getTotal()); - } - } - } - - double maxValue = Collections.max(earningsForEachMonth.values()); - for (Map.Entry entry : earningsForEachMonth.entrySet()) { - if (entry.getValue().equals(maxValue)) { - maxMonths.add(entry.getKey()); - } - } - - ObjectMapper objectMapper = new ObjectMapper(); - StringWriter output = new StringWriter(); - try { - objectMapper.writeValue(output, new Report(maxMonths)); - return output.toString(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..c539e19 --- /dev/null +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: application.Main + From c08552fab533b0b0fcda457785506852edc6759b Mon Sep 17 00:00:00 2001 From: Maksim Gurenkov Date: Mon, 29 Apr 2024 02:14:52 +0300 Subject: [PATCH 4/7] Update README.md --- .idea/encodings.xml | 7 ++++ .idea/misc.xml | 14 +++++++ .idea/vcs.xml | 6 +++ .idea/workspace.xml | 98 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 28 ++++++++++++- input.json | 2 +- 6 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e5d6295 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..bcda1fc --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + { + "associatedIndex": 8 +} + + + + + { + "keyToString": { + "Application.Main.executor": "Run", + "Maven.solution [org.apache.maven.plugins:maven-jar-plugin:3.3.0:jar].executor": "Run", + "Maven.solution [package].executor": "Run", + "RunOnceActivity.ShowReadmeOnStart": "true", + "git-widget-placeholder": "master", + "kotlin-language-version-configured": "true", + "last_opened_file_path": "/home/mgurenkov/Desktop/school2024-test-task1", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "project.structure.last.edited": "Artifacts", + "project.structure.proportion": "0.15", + "project.structure.side.proportion": "0.2", + "settings.editor.selected.configurable": "reference.settings.project.maven.repository.indices", + "vue.rearranger.settings.migration": "true" + } +} + + + + + + + + + + + + + + + 1714162168536 + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index ee9d69b..448015e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,31 @@ 4. Найденный в соответствии с условием задачи месяц должен выводиться на английском языке в нижнем регистре. Если месяцев несколько, то на вывод они все подаются на английском языке в нижнем регистре в порядке их следования в течение года. ## Автор решения - +Гуренков Максим Сергеевич ## Описание реализации - +Для выполнения задачи было решено использовать библиотеки jackson и lombok. +### Пакет "application" +В пакете `application` находятся классы, реализующие основную логику работы программы: `Main`, `Report` и `ReportGenerator`. + - В классе `Main`, с помощью библиотеки jackson данными из файла `input.json` инициализируется список объектов типа `Order`, который потом передается на вход статическому методу `generate()` класса `ReportGenerator`. Возвращаемая json-строка выводится на экран. + - Класс `Report` содержит в себе только одно поле - список месяцев, в которые были произведены наибольшие затраты. Используется для сериализации результата в json формат. + - Класс `ReportGenerator` отвечает за генерацию отчетов. Содержит один публичный (`generate()`) и два приватных метода (`countEarningsForEachMonth()` и `findMonthsWithMaxEarnings()`). + + В методе `countEarningsForEachMonth()` создается `Map`, где ключ - порядковый номер месяца (`Integer`), а значение - общая сумма трат в этом месяце (`Double`). В качестве реализации была выбрана коллекция `TreeMap`, так как она поддерживает автоматическую сортировку элементов по ключу в естественном порядке. Далее в цикле выполняется обход массива заказов, и заполняется `Map`. + + Метод `findMonthsWithMaxEarnings()` отвечает за формирование списка с месяцами, в которые были произведены максимальные затраты. + + Метод `generate()` использует все перечисленные методы для формирования отчета типа `Report`, после чего с помощью библиотеки jackson сериализуется в json формат. +### Пакет "data" +В пакете data находятся классы, представляющие из себя объектную модель входных данных: `Order` и `Status`. + - Класс `Order` содержит все поля, соответствующие аттрибутам элементов входного массива: `userId`, `orderedAt`, `status`, `total`. + - Перечисление `Status` - тип данных для поля `status` класса `Order`: COMPLETED, CANCELED, CREATED, DELIVERY. +### Пакет "utils" +В пакете `utils` содержится один класс - `LocalDateTimeDeserializer`, необходимый для корректной десериализации даты в поле типа `LocalDateTime` с помощью jackson. ## Инструкция по сборке и запуску решения +- Убедитесь, что у вас установлен maven +- Перейдите в корневую директорию проекта и выполните команду: +```bash +mvn package +``` +- В сгенерированной директории `target` будет лежать jar файл `solution-1.0-SNAPSHOT.jar`, который можно запустить с помощью команды: +```bash +java -jar solution-1.0-SNAPSHOT.jar +``` +**Обратите внимание, что для корректной работы программы входные данные должны находиться в файле с названием `input.json`, который должен лежать в той же директории, что и jar файл.** \ No newline at end of file diff --git a/input.json b/input.json index 6d404a7..d50f878 100644 --- a/input.json +++ b/input.json @@ -17,4 +17,4 @@ "status": "COMPLETED", "total": "500" } -] \ No newline at end of file +] From cce573f87cff65cf9efb530f340b67d138f52a67 Mon Sep 17 00:00:00 2001 From: mkgurenkov <145710622+mkgurenkov@users.noreply.github.com> Date: Mon, 29 Apr 2024 02:17:40 +0300 Subject: [PATCH 5/7] Delete .idea directory --- .idea/encodings.xml | 7 ---- .idea/misc.xml | 14 ------- .idea/vcs.xml | 6 --- .idea/workspace.xml | 98 --------------------------------------------- 4 files changed, 125 deletions(-) delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffa..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index e5d6295..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index bcda1fc..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - { - "associatedIndex": 8 -} - - - - - { - "keyToString": { - "Application.Main.executor": "Run", - "Maven.solution [org.apache.maven.plugins:maven-jar-plugin:3.3.0:jar].executor": "Run", - "Maven.solution [package].executor": "Run", - "RunOnceActivity.ShowReadmeOnStart": "true", - "git-widget-placeholder": "master", - "kotlin-language-version-configured": "true", - "last_opened_file_path": "/home/mgurenkov/Desktop/school2024-test-task1", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "project.structure.last.edited": "Artifacts", - "project.structure.proportion": "0.15", - "project.structure.side.proportion": "0.2", - "settings.editor.selected.configurable": "reference.settings.project.maven.repository.indices", - "vue.rearranger.settings.migration": "true" - } -} - - - - - - - - - - - - - - - 1714162168536 - - - - - - - - - - - \ No newline at end of file From 0e5951816a2fbc4eba4d31034aa2bbd24c8bb6e9 Mon Sep 17 00:00:00 2001 From: mkgurenkov <145710622+mkgurenkov@users.noreply.github.com> Date: Mon, 29 Apr 2024 02:18:06 +0300 Subject: [PATCH 6/7] Update .gitignore --- .gitignore | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 5ff6309..65f20b1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,10 +4,7 @@ target/ !**/src/test/**/target/ ### IntelliJ IDEA ### -.idea/modules.xml -.idea/jarRepositories.xml -.idea/compiler.xml -.idea/libraries/ +.idea/ *.iws *.iml *.ipr @@ -35,4 +32,4 @@ build/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store From 5197ca2ed8722399406e00325f8e554d3749370f Mon Sep 17 00:00:00 2001 From: mkgurenkov <145710622+mkgurenkov@users.noreply.github.com> Date: Mon, 29 Apr 2024 02:25:21 +0300 Subject: [PATCH 7/7] Delete SampleTest.java --- src/test/java/SampleTest.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/test/java/SampleTest.java diff --git a/src/test/java/SampleTest.java b/src/test/java/SampleTest.java deleted file mode 100644 index e69de29..0000000