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

Решение #29

Open
wants to merge 3 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
32 changes: 32 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/

### 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
42 changes: 42 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,48 @@ CodeKiller777

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

Журавлев Константин Анатольевич

## Описание реализации

Этот проект представляет собой Java приложение для анализа активности пользователей по количеству коммитов.

Он включает следующие компоненты:
- Класс `FileManager` для работы с файлами: чтения данных о коммитах из файла и записи результата в файл.
- Класс `CommitValidator` для проверки данных на валидность.
- Класс `ActivityAnalyzer` для поиска трех пользователей с наибольшим количеством коммитов.

Статический метод `FileWorker.read` построчно считывает данные о коммитах из текстового файла `commits.txt`. Строка проходит валидацию `CommitValidator.isValidCommitInfo`: если она валидна, то происходит обработка коммита, иначе - строка пропускается, а в консоль выводится сообщение о некорректности строки. Далее, для анализа активности пользователей вызывается метод `ActivityAnalyzer.findTopThreeUsersWithMostCommits`, который анализирует данные о коммитах и определяет три пользователя с наибольшим количеством коммитов. После этого полученные результаты записываются в файл `result.txt` с помощью статического метода `FileWorker.write`.

## Инструкция по сборке и запуску решения
Это приложение использует систему сборки Maven для управления зависимостями и сборки проекта.

### Предварительные требования

Перед запуском проекта убедитесь, что у вас установлены следующие компоненты:

- Java Development Kit (JDK)
- Maven

### Как запустить проект

1. **Клонирование репозитория**

Клонируйте репозиторий на ваш локальный компьютер:

```bash
git clone https://github.com/constZhur/croc-test-task.git

2. **Сборка**

Выполните сборку проекта с помощью Maven:

```bash
mvn clean package

3. **Запуск**

После успешной сборки, запустите приложение:

```bash
java -jar target/croc-test-task-1.0-SNAPSHOT.jar
59 changes: 59 additions & 0 deletions commits.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
AIvanov 25ec001 2024-04-24T13:56:39.492
AIvanov 1a3b5c7 2024-04-25T08:12:20.123
constZhur 9f8e7d6 2024-04-26T17:30:45.678
MikhailStatsenko 0f0e0d0 2024-04-27T10:45:55.321
wenos 8765432 2024-04-28T15:20:10.987
FWilson 2468101 2024-04-29T09:55:30.654
constZhur abcdef0 2024-04-30T20:40:45.789
AIvanov 9999999 2024-05-01T11:11:11.111
constZhur qwertyu 2024-05-02T12:34:56.789
wenos asdfghj 2024-05-03T18:00:00.000
MMartin zxcvbnm 2024-05-04T07:30:15.975
MikhailStatsenko 7777777 2024-05-05T22:45:30.864
AIvanov abcd123 2024-05-06T14:00:01.234
PParker 9876543 2024-05-07T19:15:45.321
MikhailStatsenko 6543210 2024-05-08T08:30:30.654
RRichardson 8888 2024-05-09T16:45:15.987
AIvanov 5555555 2024-05-10T05:55:55.555
wenos 4444444 2024-05-11T11:11:11.111
constZhur 3333333 2024-05-12T17:17:17.777
VRobinson 2222222 2024-05-13T22:22:22.222
WAllen 1111111 2024-05-14T03:33:33.333
wenos 0000000 2024-05-15T09:45:45.456
constZhur qazwsx1 2024-05-16T18:18:18.181
constZhur 1122334 2024-05-17T21:21:21.212
wenos 3344556 2024-05-18T08:08:08.808
BBWright 778899011 2024-05-19T19:19:19.199
CCarter 1122334 2024-05-20T12:12:12.121
constZhur 5566778 2024-05-21T15:15:15.151
EEvans 9900112 2024-05-22T06:06:06.060
constZhur 2244668 2024-05-23T23:23:23.232
GGonzalez 8800111 2024-05-24T07:07:07.070
MikhailStatsenko 6677222 2024-05-25T17:17:17.171
constZhur 4455888 2024-05-26T19:19:19.191
constZhur 3322110 2024-05-27T10:10:10.101
MikhailStatsenko 5577889 2024-05-28T12:12:12.121
LLee 8899553 2024-05-29T23:23:23.232
MikhailStatsenko 3322665 2024-05-30T14:14:14.141
NNelson 5511447 2024-05-31T16:16:16.161
MikhailStatsenko 7766223 2024-06-01T06:06:06.060
wenos 1144776 2024-06-02T07:07:07.070
_QPhillips 7788990 2024-06-03T18:18:18.181
wenos 1122334 2024-06-04T09:09:09.090
MikhailStatsenko 3344556 2024-06-05T20:20:20.202
MikhailStatsenko 7788990 2024-06-06T03:03:03.030
wenos 1122334 2024-06-10T18:18:18.181
YYoung 3344556 2024-06-11T09:09:09.090 aaaa
wenos 7788990 2024-06-12T20:20:20.202
AIvanov 25ec001 2024-04-24T13:56:39.492
MikhailStatsenko 1a3b5c7 2024-04-25T08:12:20.123
constZhur 9f8e7d6 2024-04-26T17:30:45.678
MikhailStatsenko 0f0e0d0 2024-04-27T10:45:55.321
1EJones 8765432 2024-04-28T15:20:10.987
FWilson 2468101 2024-04-29T09:55:30
GHernandez abcdef0 2024-04-30T20:40:45.789
MikhailStatsenko qwertyu 2024-05-02T12:34:56.789
wenos asdfghj 2024-05-03T18:00:00.000
constZhur zxcvbnm 2024-05-04T07:30:15.975
wenos abcd123 2024-05-06T14:00:01.234
MikhailStatsenko qazwsx1 2024-05-16T18:18:18.181
33 changes: 33 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?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>ru.croc</groupId>
<artifactId>croc-test-task</artifactId>
<version>1.0</version>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>


<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifestFile>src/main/resources/manifest.mf</manifestFile>
</archive>
</configuration>
</plugin>
</plugins>
</build>

</project>
3 changes: 3 additions & 0 deletions result.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
MikhailStatsenko
constZhur
wenos
35 changes: 35 additions & 0 deletions src/main/java/ru/croc/ActivityAnalyzer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.croc;

import java.util.*;

/**
* Класс для анализа активности пользователей по количеству коммитов.
*/
public class ActivityAnalyzer {

/**
* Находит три пользователя с наибольшим количеством коммитов.
*
* @param commitCounts Словарь, ключ: имя пользователя, значение: количество их коммитов.
* @return Список имен трех пользователей с наибольшим количеством коммитов, в порядке убывания.
*/
public static List<String> findTopThreeUsersWithMostCommits(Map<String, Integer> commitCounts) {
List<String> users = new ArrayList<>();

// Создаем копию Map для сортировки по значению (количеству коммитов)
Map<String, Integer> sortedMap = new LinkedHashMap<>();
commitCounts.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEachOrdered(entry -> sortedMap.put(entry.getKey(), entry.getValue()));

// Выбираем первые три записи (пользователей с наибольшим количеством коммитов)
int count = 0;
for (String user : sortedMap.keySet()) {
users.add(user);
count++;
if (count == 3) break;
}

return users;
}
}
65 changes: 65 additions & 0 deletions src/main/java/ru/croc/CommitValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package ru.croc;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Класс для валидации данных о коммитах.
*/
public class CommitValidator {
// Регулярные выражения для проверки формата имени, хэша и даты
private static final String USERNAME_REGEX = "^[a-zA-Z_][a-zA-Z0-9_]*$";
private static final String COMMIT_HASH_REGEX = "^[a-zA-Z0-9]{7}$";
private static final String DATE_REGEX = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?$";

// Шаблоны для компиляции регулярных выражений
private static final Pattern USERNAME_PATTERN = Pattern.compile(USERNAME_REGEX);
private static final Pattern COMMIT_HASH_PATTERN = Pattern.compile(COMMIT_HASH_REGEX);
private static final Pattern DATE_PATTERN = Pattern.compile(DATE_REGEX);

/**
* Проверяет валидность имени пользователя.
*
* @param username Имя пользователя для проверки.
* @return true, если имя пользователя валидно, иначе false.
*/
private static boolean isValidUsername(String username) {
Matcher matcher = USERNAME_PATTERN.matcher(username);
return matcher.matches();
}

/**
* Проверяет валидность хэша коммита.
*
* @param commitHash Хэш коммита для проверки.
* @return true, если хэш коммита валиден, иначе false.
*/
private static boolean isValidCommitHash(String commitHash) {
Matcher matcher = COMMIT_HASH_PATTERN.matcher(commitHash);
return matcher.matches();
}

/**
* Проверяет валидность формата даты.
*
* @param date Дата для проверки.
* @return true, если формат даты валиден, иначе false.
*/
private static boolean isValidDate(String date) {
Matcher matcher = DATE_PATTERN.matcher(date);
return matcher.matches();
}

/**
* Проверяет валидность строки данных о коммите.
*
* @param username Имя пользователя.
* @param commitHash Хэш коммита.
* @param date Дата коммита.
* @return true, если данные о коммите валидны, иначе false.
*/
public static boolean isValidCommitInfo(String username, String commitHash, String date) {
return isValidUsername(username) && isValidCommitHash(commitHash)
&& isValidDate(date);
}
}
59 changes: 59 additions & 0 deletions src/main/java/ru/croc/FileManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package ru.croc;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static ru.croc.CommitValidator.*;

/**
* Класс для работы с файлами
*/
public class FileManager {

/**
* Считывает данные о коммитах из файла и подсчитывает количество коммитов для каждого пользователя.
*
* @return Словарь, ключ: имя пользователя, значение: количество их коммитов.
*/
public static Map<String, Integer> read() {
String path = "commits.txt";

Map<String, Integer> commitCounts = new HashMap<>();
try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(" ");
if (parts.length == 3 && isValidCommitInfo(parts[0], parts[1], parts[2])) {
commitCounts.put(parts[0], commitCounts.getOrDefault(parts[0], 0) + 1);
} else {
System.out.println("Некорректный формат строки: " + line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return commitCounts;
}

/**
* Записывает список пользователей в файл.
*
* @param users Список пользователей для записи.
*/
public static void write(List<String> users) {
String path = "result.txt";

try (BufferedWriter writer = new BufferedWriter(new FileWriter(path))) {
// Записываем каждого пользователя на отдельной строке
for (String user : users) {
writer.write(user);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}

}
12 changes: 12 additions & 0 deletions src/main/java/ru/croc/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.croc;

import java.util.List;
import java.util.Map;

public class Main {
public static void main(String[] args) {
Map<String, Integer> commitCounts = FileManager.read();
List<String> topThreeUsers = ActivityAnalyzer.findTopThreeUsersWithMostCommits(commitCounts);
FileManager.write(topThreeUsers);
}
}
2 changes: 2 additions & 0 deletions src/main/resources/manifest.mf
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Manifest-Version: 1.0
Main-Class: ru.croc.Main