Skip to content

Решенное тестовое задание #4

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

Open
wants to merge 1 commit 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
107 changes: 107 additions & 0 deletions Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Scanner;

public class Main {

private static final String PATH_TO_INTEREST_TXT = "interest.txt"; // путь до файла interest.txt
private static final String PATH_TO_INFLUENCE_TXT = "influence.txt"; // путь до файла influence.txt
private static final String PATH_TO_RESULT_TXT = "result.txt"; // путь до файла result.txt
private static final String REGEXP_RANK = " "; // регулярное выражение для считывания в матрице попарного сравнения
private static final String REGEXP_STAKEHOLDER = " \\| "; // регулярное выражение для считывания имен в матрице попарного сравнения
private static Scanner scanner;

public static void main(String[] args) throws IOException {
String[] stakeholders = readStakeholders(); // Предполагаем, что имена стейкхолдеров одинаковы в обоих файлах
double[][] interestMatrix = readMatrix(PATH_TO_INTEREST_TXT, stakeholders.length);
double[][] influenceMatrix = readMatrix(PATH_TO_INFLUENCE_TXT, stakeholders.length);

double[] interestRanks = calculateRanks(interestMatrix);
double[] influenceRanks = calculateRanks(influenceMatrix);

writeToResultFile(stakeholders, interestRanks, influenceRanks);
}

/**
* Записывает в результирующий файл result.txt имена стейкхолдеров, у которых оба ранга (интерес и влияние)
* превышают половину общего числа стейкхолдеров.
*
* @param stakeholders массив строк, содержащий имена стейкхолдеров
* @param interestRanks массив типа double, содержащий итоговые ранги интереса каждого стейкхолдера
* @param influenceRanks массив типа double, содержащий итоговые ранги влияния каждого стейкхолдера
* @throws IOException в случае возникновения ошибки при работе с файловой системой
*/
private static void writeToResultFile(String[] stakeholders, double[] interestRanks, double[] influenceRanks) throws IOException {
for (int i = 0; i < stakeholders.length; i++) {
if (interestRanks[i] > (double) stakeholders.length / 2 && influenceRanks[i] > (double) stakeholders.length / 2) {
Files.writeString(Path.of(PATH_TO_RESULT_TXT), stakeholders[i] + System.lineSeparator(), StandardOpenOption.CREATE, StandardOpenOption.APPEND);
}
}
}

/**
* Считывает строку с именами стейкхолдеров из файла, указанного в константе PATH_TO_INTEREST_TXT.
* Использует регулярное выражение REGEXP для разделения строки на отдельные имена
*
* @return массив строк, содержащий имена стейкхолдеров
* @throws FileNotFoundException если файл, указанный в PATH_TO_INTEREST_TXT, не найден
*/
private static String[] readStakeholders() throws FileNotFoundException {
scanner = new Scanner(new File(PATH_TO_INTEREST_TXT));
String[] stakeholders = scanner.nextLine().split(REGEXP_STAKEHOLDER);
scanner.close();

return stakeholders;
}

/**
* Считывает матрицу попарного сравнения из файла
*
* @param filename имя файла, содержащего матрицу
* @param size размер матрицы (количество стейкхолдеров)
* @return двумерный массив типа double, представляющий матрицу попарного сравнения
* @throws FileNotFoundException если файл с указанным именем не найден
*/
private static double[][] readMatrix(String filename, int size) throws FileNotFoundException {
scanner = new Scanner(new File(filename));
scanner.nextLine(); // Пропускаем строку с именами стейкхолдеров

double[][] matrix = new double[size][size];

for (int i = 0; i < size; i++) {
String[] row = scanner.nextLine().split(REGEXP_RANK);
for (int j = 0; j < size; j++) {
matrix[i][j] = row[j].equals("_") ? 0 : Double.parseDouble(row[j]);
}
}

scanner.close();
return matrix;
}

/**
* Вычисляет итоговый ранг заинтересованной стороны путем складывания величин в строке матрицы сравнения
*
* @param matrix двумерный массив типа double, представляющий матрицу попарного сравнения.
* Размер матрицы соответствует количеству ЗС, и каждый элемент матрицы
* представляет собой величину влияния или интереса одной ЗС к другой.
* На главной диагонали матрицы значения равны "_", так как сравнение ЗС самой с собой некорректно.
* @return массив типа double, содержащий итоговые ранги каждой ЗС
*/
private static double[] calculateRanks(double[][] matrix) {
int size = matrix.length;
double[] ranks = new double[size];

for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
ranks[i] += matrix[i][j];
}
}

return ranks;
}
}
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,20 @@ Stakeholder 3

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

Данилов Дмитрий Владимирович

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

1. Считывание данных из файлов: Сначала программа считывает имена стейкхолдеров из файла `interest.txt` и использует их для определения размера матриц. Потом считываются матрицы попарного сравнения из файлов `interest.txt` и `influence.txt`, используя регулярные выражения для разделения строк и столбцов матрицы
2. Вычисление итоговых рангов: Для каждой матрицы вычисляются итоговые ранги каждого стейкхолдера путем суммирования значений в строке матрицы
3. Определение важных стейкхолдеров: Стейкхолдеры, у которых оба ранга (интерес и влияние) превышают половину общего числа стейкхолдеров (т.е. находятся в правом верхнем квадранте), считаются важными. Имена этих стейкхолдеров записываются в файл `result.txt`

В тех случаях, когда у нас сравниваются либо единственный стейкхолдер, либо 2 стейкхолдера, в файле `result.txt` мы не получим важных стейкхолдеров

## Инструкция по сборке и запуску решения

1. Склонировать репозиторий на локальную машину
2. Указать путь до файлов `interest.txt` и `influence.txt`
3. Скомпилировать программу, выполнив следующую команду: `javac Main.java`
4. Запустите программу, выполнив следующую программу: `java Main`
5. В результате программы в файле `result.txt` будут имена важных ЗС
4 changes: 4 additions & 0 deletions influence.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Stakeholder 1 | Stakeholder 2 | Stakeholder 3
_ 1 1
1 _ 1
1 1 _
4 changes: 4 additions & 0 deletions interest.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Stakeholder 1 | Stakeholder 2 | Stakeholder 3
_ 1 1
1 _ 1
1 1 _