Skip to content
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

Entering task is done #18

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,29 @@ CodeKiller777

## Автор решения

Яриков Станислав Сергеевич

## Описание реализации
Решение реализовано с помощью двух классов: Main и Top3Contributors.
### Работа с файлами в классе Main
В первом классе в методе main реализован вход в программу: чтение коммитов из файла построчно в список, вызов статического метода нахождения самых популярных кодеров из класса Top3Contributors и запись имен топовых контрибьютеров в файл.

Методы:

_+ main(String[] args): void_ (статический, реализует чтение коммитов из файла, вызов метода по обработке коммитов и записи топовых контрибьютеров в файл)

### Обработка коммитов в классе Top3Contributors
Класс Top3Contributors содержит в себе приватный статический метод оценки корректности коммитов и публичный статический метод нахождения наиболее активных контрибьютеров, который и вызывается из main, а также статические неизменяемые поля настроек требуемых данных.

Методы:

_+findByCommitsCount(List<String> allCommits): List<String>_ (статический, проверяет данные на корректность и формирует список из имен самых топовых контрибьютеров)

_-validation(String commit): boolean_ (проверяет, валиден ли коммит)

В реализации используются ООП, java streams, парсинг текстов, методы чтения и записи данных в файлы и из них, обработка исключений.

## Инструкция по сборке и запуску решения
В проекте по пути src/files/ лежит текстовый файл paths.txt, хранящий в себе путь к commits.txt и result.txt построчно. По умолчанию пути: "src/files/commits.txt" и "src/files/result.txt".

Точка входа в программу в классе Main в методе main(String[] args): src/Main
11 changes: 11 additions & 0 deletions enteringTaskKROK.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
42 changes: 42 additions & 0 deletions src/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class Main {

public static void main(String[] args) {

// чтение путей файла чтения и файла записи в список
List<String> paths = null;
try {
paths = Files.readAllLines(Paths.get("src/files/paths.txt"));
} catch (IOException e) {
System.out.println("Error reading paths.txt");
throw new RuntimeException(e);
}

try (BufferedWriter writer = new BufferedWriter(new FileWriter(paths.getLast()))) {

// чтение строк из файла "commits.txt" в список
List<String> allCommits = Files.readAllLines(Paths.get(paths.getFirst()));

// вызов статического метода класса Top3Contributors для нахождения наиболее активных участников
// по количеству коммитов
List<String> topContributors = Top3Contributors.findByCommitsCount(allCommits);

for (String contributor: topContributors) {
writer.write(contributor + "\n");
}

} catch (IOException e) {
if (e.toString().contains("commits.txt"))
System.out.println("Error reading commits.txt");
else
System.out.println("Error writing result.txt");
e.getMessage();
}
}
}
68 changes: 68 additions & 0 deletions src/Top3Contributors.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import java.text.ParseException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.text.SimpleDateFormat;

public class Top3Contributors {

private static final int elemCount = 3;
private static final int hashLength = 7;
private static final String dateFormat = "yyyy-MM-dd";
private static final String timeFormat = "HH:mm:ss";

public static List<String> findByCommitsCount(List<String> allCommits) {

// Получаем мапу с валидными коммитами с ключами из имен пользователей
// и значениями - количеством их коммитов
Map<String, Long> commitCounts = allCommits.stream()
.filter(Top3Contributors::validation)
.map((e) -> e.split(" ")[0])
.collect(Collectors.groupingBy(String::valueOf, Collectors.counting()));

// сортируем по убыванию количества коммитов и возвращаем 3 самых первых
return commitCounts.entrySet().stream()
.sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
.limit(3)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}

// метод для проверки коммитов на правильность формата данных
private static boolean validation(String commit) throws IllegalArgumentException {

boolean ind = true;

String[] splitCommit = commit.split(" ");

// Проверка, состоит ли строка коммита из 3 элементов
if (splitCommit.length != elemCount) {
return false;
}

// Проверка, начинается ли имя пользователя с цифр
if (Character.isDigit(splitCommit[0].charAt(0))) {
return false;
}

// Проверка, состоит ли сокращенный хэш коммита из 7 символов в нижнем регистре
if (splitCommit[1].length() != hashLength || !splitCommit[1].equals(splitCommit[1].toLowerCase())) {
return false;
}

// Проверка, соответсвует ли формат даты и времени требуемым
if (splitCommit[2].length() > 10 && splitCommit[2].charAt(10) != 'T')
return false;
try {
SimpleDateFormat format = new SimpleDateFormat();
format.applyPattern(dateFormat);
format.parse(splitCommit[2].substring(0, 10));
format.applyPattern(timeFormat);
format.parse(splitCommit[2].substring(11));
} catch (ParseException e) {
return false;
}

return ind;
}
}
9 changes: 9 additions & 0 deletions src/files/commits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
AIvanov 25ee001 2024-04-24T13:56:39.492
Anatoliy2024 212ec01 2024-05-10T12:26:39.142
AIvanov 21ew001 2024-05-04T12:16:19.492
AKalinin 25ec001 2024-04-24T13:56:39.492
Anatoliy2024 25ec001 2024-04-23T11:56:29.492
AKalinin 25ec001 2024-04-13T09:56:39.492
KrisVal 25ec001 2024-04-24T13:56:39.492
KrisVal 25ec001 2024-04-24T13:56:39.492
AIIIvanov 25ec001 2024-04-24T13:56:39.492
2 changes: 2 additions & 0 deletions src/files/paths.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
src/files/commits.txt
src/files/result.txt
3 changes: 3 additions & 0 deletions src/files/result.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
AIvanov
AKalinin
KrisVal