/
fedion
/
hw2
Обзор
Документация
Войти
/
fedion
/
hw2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/org/example/SingleThreadCrawler.java
83 строки
3 KB
Constantin Sharypov
Задание 2
15 окт 2025, 21:38
15 окт 2025, 21:38
6cbdec2
Код
Авторство
О чём код?
package org.example; import lombok.AllArgsConstructor; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import static java.lang.String.join; public class SingleThreadCrawler { public static void main(String[] args) throws Exception { SingleThreadCrawler crawler = new SingleThreadCrawler(); long startTime = System.nanoTime(); String result = crawler.find("Java_(programming_language)", "Cat", 5, TimeUnit.MINUTES); long finishTime = TimeUnit.SECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS); System.out.println("Took "+finishTime+" seconds, result is: " + result); } private Queue<Node> searchQueue = new LinkedList<>(); private Set<String> visited = new HashSet<>(); private WikiClient client = new WikiClient(); public String find(String from, String target, long timeout, TimeUnit timeUnit) throws Exception { long deadline = System.nanoTime() + timeUnit.toNanos(timeout); searchQueue.offer(new Node(from, null)); Node result = null; while (result == null && !searchQueue.isEmpty()) { if (deadline < System.nanoTime()) { throw new TimeoutException(); } Node node = searchQueue.poll(); System.out.println("Get page: " + node.title); Set<String> links = client.getByTitle(node.title); if (links.isEmpty()) { //pageNotFound continue; } for (String link : links) { String currentLink = link.toLowerCase(); if (visited.contains(currentLink)) { continue; } visited.add(currentLink); Node subNode = new Node(link, node); if (target.equalsIgnoreCase(currentLink)) { result = subNode; continue; } searchQueue.offer(subNode); } } if (result != null) { List<String> resultList = new ArrayList<>(); Node search = result; while (true) { resultList.add(search.title); if (search.next == null) { break; } search = search.next; } Collections.reverse(resultList); return join(" > ", resultList); } return "not found"; } @AllArgsConstructor private static class Node { String title; Node next; } }