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

Сделанное тестовое задание #3

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
71 changes: 71 additions & 0 deletions Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package croc;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

public static void main(String[] args) {
// Если не передан путь к файлу в командной строке, завершаем работу программы
if (args.length == 0) {
System.out.println("Usage: java Main <html_file>");
return;
}

// Получаем из аргументов путь к файлу, запускаем нашу функцию, печатаем результат в консоль
String htmlFile = args[0];
try {
String result = findUniqueDomains(htmlFile);
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}

public static String findUniqueDomains(String htmlFile) throws IOException {
// Получение текстового представления html-файла
String htmlContent = Files.readString(Paths.get(htmlFile));

// Компиляция паттерна и матчинг по тексту
Pattern linkPattern = Pattern.compile("(?:[\\p{L}\\d-]+\\.)+[\\p{L}\\d-]+");
Matcher matcher = linkPattern.matcher(htmlContent);

Set<String> uniqueDomains = new HashSet<>();
// Пока находятся совпадения с паттерном, добавляем их в множество
// Если домен начинается с 'www.', удаляем данную часть из домена
while (matcher.find()) {
String domain = matcher.group();
if (domain.startsWith("www.")) {
domain = domain.substring(4);
}
uniqueDomains.add(domain.toLowerCase());
}

// Приводим с списку найденные домены и сортируем по условию задачи
List<String> domainsList = new ArrayList<>(uniqueDomains);
domainsList.sort(String::compareTo);

// Создаём JSON-строку формата, заданного в условии
StringBuilder jsonBuilder = new StringBuilder("{\"sites\": [");
boolean first = true;
for (String domain : domainsList) {
if (!first) {
jsonBuilder.append(",");
} else {
first = false;
}
jsonBuilder.append("\"").append(domain).append("\"");
}
jsonBuilder.append("]}");

return jsonBuilder.toString();
}
}

18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,23 @@
4. Найденные в соответствии с условием задачи домены должны выводиться в нижнем регистре без указания протокола и «www» в алфавитном порядке.

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

Мусаилов Арсений Сергеевич
## Описание реализации
Для парсинга всех уникальных доменов с page.html используются регулярные выражения и классы из пакета java.util.regex

Функция findUniqueDomains принимает в качестве параметра путь к html файлу, с помощью составленного паттерна ищет совпадения в заданном файле (при этом html файл читается просто как текст), и добавляет их в множество найденных доменов. После чего задаётся нужный формат json-строки, в которую помещаются все данные, и функция возвращает значение данной строки.
Функция находит домены на всех возможных языках, в том числе на кириллице.

main-метод печатает полученную строку в консоль.

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

Находясь в директории проекта, необходимо скомпилировать файл Main.java. Для этого в терминале вводим команду:
```
javac .\Main.java
```
После чего запускаем программу с помощью следующей команды, указав в качестве аргумента путь к html файлу, например:
```
java .\Main.java .\path\to\page.html
```