Java сумма зарплат из файла .csv - PullRequest
2 голосов
/ 12 апреля 2020

Я пытаюсь суммировать зарплаты для каждого типа работы из файла .csv, и сейчас мой вывод показывает только, сколько зарабатывает каждый человек. Мне нужно подвести итоги этой работы, и я понятия не имею, как написать метод, который будет суммировать зарплаты для каждой работы. У вас есть идеи, как я могу изменить свой код, чтобы получить сумму заработков?

package src;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;
public class Main {
   public static void main(String[] args) {
       Path path = Path.of("sample.csv");
       try (Stream<String> lines = Files.lines(path);) {
           lines.filter(line -> line.startsWith(" "))
                .map(line -> LineToPerson(line))
                .forEach(System.out::println);
       }
       catch (IOException e) {
           e.printStackTrace();
       }
   }
   private static Person LineToPerson(String line) {
       String[] elements = line.split(";");
       String id = elements[0];
       String name = elements[1];
       String surname = elements[2];
       String job = elements[3];
       Double salary = Double.valueOf(elements[4].replaceAll("\"", "").replaceAll(" ", "").replaceAll(",", "."));
       Person p = new Person(id, name, surname, job, salary);
       return p;
   }
}

-------------------- класс Person-- --------------------------------

package src;

public class Person {

   private String id;
   private String name;
   private String surname;
   private String job;
   private double salary;

   public Person() {

   }
   public Person(String id, String name, String surname, String job, double salary) {
       this.id = id.replaceAll("\"", "").replaceAll(" ", "");
       this.name = name.replaceAll("\"", "").replaceAll(" ", "");
       this.surname = surname.replaceAll("\"", "").replaceAll(" ", "");
       this.job = job.replaceAll("\"", "").replaceAll(" ", "");
       this.salary = salary;
   }
   public String getId() {
       return id;
   }
   public String getName() {
       return name;
   }
   public String getSurname() {
       return surname;
   }
   public String getJob() {
       return job;
   }
   public double getSalary() {
       return salary;
   }
   public String toString() {
       if (job.equals("Teacher")) {
           return "Teacher salary = " + salary;
       } else if (job.equals("Janitor")) {
           return "Janitor salary = " + salary;
       } else return "";
   }
}

1 Ответ

1 голос
/ 12 апреля 2020

Вам нужно сгруппировать по job следующим образом:

lines.filter(line -> line.startsWith(" "))
        .map(line -> LineToPerson(line))
        .collect(Collectors.groupingBy(person -> person.getJob(),
                                Collectors.summingDouble(person -> person.getSalary())))
        .forEach((job,sumSalary) -> System.out.println(job + "\t" + sumSalary));

Заменить

try (Stream<String> lines = Files.lines(path);) {
   lines.filter(line -> line.startsWith(" "))
        .map(line -> LineToPerson(line))
        .forEach(System.out::println);
}

на

try (Stream<String> lines = Files.lines(path);) {
    lines.filter(line -> line.startsWith(" "))
        .map(line -> LineToPerson(line))
        .collect(Collectors.groupingBy(person -> person.getJob(),
                                Collectors.summingDouble(person -> person.getSalary())))
        .forEach((job,sumSalary) -> System.out.println(job + "\t" + sumSalary));
}
...