├── .gitignore
├── readme.txt
├── pom.xml
└── src
└── main
└── java
└── com
└── zufar
└── socialpaymentparcer
└── App.java
/.gitignore:
--------------------------------------------------------------------------------
1 | /target/
2 | nb-configuration.xml
3 | *.iml
4 | /.idea/
5 | *.NavData
--------------------------------------------------------------------------------
/readme.txt:
--------------------------------------------------------------------------------
1 | Есть большой файл выплат (не помещается в оперативную память). Формат файла социальный номер и сумма в формате 10.00. Разделитель полей в файле;
2 | Один и тот же социальный номер встречается в файле более одного раза.
3 |
4 | Максимально быстрым способом создать файл содержащий социальный номер и общую сумму выплат по нему. Формат файла тот же. Таким образом социальный номер в выходном файле уникален
5 |
6 | Предположение: выходной файл также предполагается большим и не поместится в оперативную память
7 |
8 | Пример:
9 |
10 | Входной файл
11 |
12 | 123456;10.00
13 | 123457;8.00
14 | 123456;14.00
15 | 123451;3.00
16 |
17 | Выходной файл
18 |
19 | 123456;24.00
20 | 123457;8.00
21 | 123451;3.00
22 |
23 | Зачитывающиеся критерии
24 |
25 | 1. Предложен алгоритм (минимум)
26 | 2. Написан код (максимум)
27 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 | 4.0.0
6 |
7 | com.zufar
8 | socialpaymentparcer
9 | 1.0.0
10 | jar
11 |
12 | The program parses input file of SocialPayment.
13 | There is a file as a result which contains social number and payment sum.
14 |
15 |
16 |
17 | UTF-8
18 | 1.8
19 | 1.8
20 |
21 |
22 |
23 |
24 |
25 |
26 | org.apache.maven.plugins
27 | maven-compiler-plugin
28 |
29 | 8
30 | 8
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/main/java/com/zufar/socialpaymentparcer/App.java:
--------------------------------------------------------------------------------
1 | package com.zufar.socialpaymentparcer;
2 |
3 | import java.io.IOException;
4 | import java.nio.file.Files;
5 | import java.nio.file.Paths;
6 | import java.util.HashMap;
7 | import java.util.Map;
8 | import java.util.stream.Stream;
9 |
10 | public class App {
11 | public static void main(String[] args) {
12 | Map outputSocialPayments = new HashMap<>();
13 | String separator = args[2];
14 | try {
15 | getSocialPaymentStream(args[0]).forEach((currentPayment) -> handlePayment(outputSocialPayments, currentPayment, separator));
16 | writeSocialPaymentsToFile(outputSocialPayments, args[1], separator);
17 | } catch (IOException exception) {
18 | System.err.println(exception.getMessage());
19 | }
20 | }
21 |
22 | private static void handlePayment(Map outputSocialPayments, String currentPayment, String separator) {
23 | String[] splittedPayment = currentPayment.split(separator);
24 | String socialNumber = splittedPayment[0];
25 | Double paymentSum = Double.parseDouble(splittedPayment[1]);
26 | outputSocialPayments.merge(socialNumber, paymentSum, Double::sum);
27 | }
28 |
29 | private static void writeSocialPaymentsToFile(Map outputSocialPayments, String filePath, String separator) throws IOException {
30 | Files.write(Paths.get(filePath), () -> outputSocialPayments
31 | .entrySet()
32 | .stream()
33 | .map(e -> e.getKey() + separator + e.getValue())
34 | .iterator()
35 | );
36 | }
37 |
38 | private static Stream getSocialPaymentStream(String filePath) throws IOException {
39 | return Files.lines(Paths.get(filePath));
40 | }
41 | }
42 |
--------------------------------------------------------------------------------