├── .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 | --------------------------------------------------------------------------------