-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Добавлена реализация решения задачи по анализу рабочего времени сотрудников #10
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Large diffs are not rendered by default.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
<?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>TestCroc</artifactId> | ||
<version>1.0-SNAPSHOT</version> | ||
<build> | ||
<plugins> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-compiler-plugin</artifactId> | ||
<version>3.8.1</version> | ||
<configuration> | ||
<source>1.8</source> | ||
<target>1.8</target> | ||
</configuration> | ||
</plugin> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-jar-plugin</artifactId> | ||
<version>3.2.0</version> | ||
<configuration> | ||
<archive> | ||
<manifest> | ||
<addClasspath>true</addClasspath> | ||
<mainClass>org.example.DisbalanceCounter</mainClass> | ||
<packageName>test</packageName> | ||
<addClasspath>true</addClasspath> | ||
<classpathPrefix>lib/</classpathPrefix> | ||
</manifest> | ||
</archive> | ||
</configuration> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
<properties> | ||
<maven.compiler.source>20</maven.compiler.source> | ||
<maven.compiler.target>20</maven.compiler.target> | ||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | ||
</properties> | ||
</project> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
package org.example; | ||
|
||
import java.io.*; | ||
import java.nio.file.*; | ||
import java.util.*; | ||
import java.util.stream.*; | ||
import java.util.List; | ||
|
||
public class DisbalanceCounter{ | ||
|
||
private static double weeklyNorm; | ||
private static String reportPath; | ||
private static String resultPath; | ||
|
||
public static void main(String[] args) { | ||
Properties properties = new Properties(); | ||
|
||
//взятие путей к файлам из конфига и обработка ошибок | ||
try(InputStream input = DisbalanceCounter.class.getClassLoader().getResourceAsStream("config.properties");) { | ||
properties.load(input); | ||
} catch (FileNotFoundException e) { | ||
e.printStackTrace(); | ||
} catch (IOException e) { | ||
e.printStackTrace(); | ||
System.exit(1); | ||
} | ||
//инициализация путей к файлам | ||
reportPath = properties.getProperty("reportPath"); | ||
resultPath = properties.getProperty("resultPath"); | ||
//доп проверка | ||
if (reportPath == null || resultPath == null) { | ||
System.out.println("конфигурация должна содержать файлы ввода и вывода"); | ||
System.exit(1); | ||
} | ||
|
||
try { | ||
//инициализация переменных, для работы с файлами и данными | ||
File reportFile = new File(reportPath); | ||
File resultFile = new File(resultPath); | ||
|
||
Path resultPath = resultFile.toPath(); | ||
Path reportPath = reportFile.toPath(); | ||
|
||
//чтение каждой строки из файла в список | ||
List<String> textLines = Files.readAllLines(reportPath); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. тут не принципиально скорее всего, но что если у тебя размер файла превышает размер памяти? Я бы делал через FileReader (погугли примеры) |
||
Map<String, Employee> employeeMap = new HashMap<>(); | ||
|
||
//сохранение недельной нормы(первая строка файла) | ||
weeklyNorm = Double.parseDouble(textLines.get(0)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ты подразумеваешь тут, что у тебя чистые данные. parseDouble throws exception надо обрабатывать |
||
|
||
//цикл со 2 строки по списку из строк файла report.txt | ||
//каждая строка разбивается на отдельные данные | ||
//собирается полное имя в соответсвии с выходными данными | ||
//работник помещается в мапу с (K, V) -> (UID, Employee), Employee - статический вложенный класс | ||
for(int i = 1; i < textLines.size(); i++) { | ||
String[] parts = textLines.get(i).split(" "); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. мож ты не доделал еще, но как-будто у тебя схема данных в файле не совсем совпадает с тем, что ты тут процессишь? ID я например в файле вообще не вижу. Использовать пробел в качестве разделителя это опасно (если только это прям не требование), потому что например добавится город в файл, или например фамилия сложная (какой нить Хаджи Магомедов) - твой парсинг посыпется сразу. Используй запятую лучше, csv (comma delimited values) очень распространенный формат данных как раз для таких задач |
||
String id = parts[0]; | ||
String lastName = parts[1]; | ||
String firstName = parts[2]; | ||
String patronymic = parts[3]; | ||
String date = parts[4]; | ||
double hours = Double.parseDouble(parts[5]); | ||
String fullName = lastName + " " + firstName.charAt(0) + "." + patronymic.charAt(0) + "."; | ||
employeeMap.putIfAbsent(id, new Employee(id, fullName)); | ||
employeeMap.get(id).addHours(hours); | ||
} | ||
|
||
//создаются два отдельных списка для работников с позитивным и негативным дизбалансом | ||
//открывается поток из мапы, список фильтруется по тз | ||
//сортируется по имени | ||
//к каждому объекту класса Employee применяется метод toString() | ||
//данные собираются в созданный список | ||
List<String> negativeDisbalance = employeeMap.values().stream() | ||
.filter(e -> e.getHours() <= weeklyNorm - (0.1 * weeklyNorm)) | ||
.sorted(Comparator.comparing(Employee::getName)) | ||
.map(Employee::toString) | ||
.collect(Collectors.toList()); | ||
|
||
List<String> positiveDisbalance = employeeMap.values().stream() | ||
.filter(e -> e.getHours() >= weeklyNorm + (0.1 * weeklyNorm)) | ||
.sorted(Comparator.comparing(Employee::getName)) | ||
.map(Employee::toString) | ||
.collect(Collectors.toList()); | ||
|
||
//результирующий список | ||
List<String> results = new ArrayList<>(); | ||
results.addAll(negativeDisbalance); | ||
results.addAll(positiveDisbalance); | ||
|
||
//запись списка в файл result.txt с опцией append(файл не будет перезаписываться) | ||
Files.write(resultPath, results, StandardOpenOption.APPEND); | ||
|
||
//обработка исключений | ||
} catch (FileNotFoundException e) { | ||
e.printStackTrace(); | ||
} catch (IOException e) { | ||
e.printStackTrace(); | ||
} | ||
} | ||
|
||
//вспомогательный класс | ||
static class Employee{ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Почему статик, почему не выделил в отдельный .java file? |
||
private String UID; | ||
private String name; | ||
private double totalHours; | ||
|
||
public Employee(String UID, String name) { | ||
this.UID = UID; | ||
this.name = name; | ||
this.totalHours = 0.0; | ||
} | ||
|
||
public void addHours(double hours) { | ||
this.totalHours += hours; | ||
} | ||
|
||
public String getName() { | ||
return name; | ||
} | ||
|
||
public String getUID() { | ||
return UID; | ||
} | ||
|
||
public double getHours() { | ||
return totalHours; | ||
} | ||
|
||
public double getDisbalance() { | ||
return totalHours - weeklyNorm; | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
double disbalance = getDisbalance(); | ||
String sign = disbalance > 0 ? "+" : "-"; | ||
return String.format("%s %s%.2f", name, sign, Math.abs(disbalance)); | ||
} | ||
} | ||
} | ||
|
||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
reportPath=your_report_file_path | ||
resultPath=your_result_file_path |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,6 @@ | ||
Петров А.С. -3 | ||
Журавлева Е.А. +4 | ||
Петров А.С. -3,00 | ||
Журавлева Е.А. +4,00 | ||
Петров А.С. -3,00 | ||
Журавлева Е.А. +4,00 | ||
Петров А.С. -3,00 | ||
Журавлева Е.А. +4,00 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Молодец, что добавил .gitignore.
сам писал или автоснегерированный?