diff --git "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" index 577aa6a..d8ff290 100644 --- "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" +++ "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" @@ -1,7 +1,32 @@ package com.school.faang.hashmap.задача_1; +import java.util.HashMap; +import java.util.Map; + public class Solution { + private final Map likesMap = new HashMap<>(); + + private void likeVideo(String videoId) { + likesMap.put(videoId, getLikes(videoId) + 1); + } + + private int getLikes(String videoId) { + return likesMap.getOrDefault(videoId, 0); + } + public static void main(String[] args) { + Main main = new Main(); + + main.likeVideo("dQw4w9WgXcQ"); + main.likeVideo("dQw4w9WgXcQ"); + main.likeVideo("xvFZjo5PgG0"); + main.likeVideo("dQw4w9WgXcQ"); + main.likeVideo("xvFZjo5PgG0"); + main.likeVideo("abcdefgh1234"); + System.out.println("Likes for dQw4w9WgXcQ: " + main.getLikes("dQw4w9WgXcQ")); + System.out.println("Likes for xvFZjo5PgG0: " + main.getLikes("xvFZjo5PgG0")); + System.out.println("Likes for abcdefgh1234: " + main.getLikes("abcdefgh1234")); + System.out.println("Likes for unknownID: " + main.getLikes("unknownID")); } } diff --git "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" index 0c9133b..16d823a 100644 --- "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" +++ "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" @@ -2,6 +2,30 @@ public class Solution { public static void main(String[] args) { + UserManager manager = new UserManager(); + manager.addUser(new User(1, "Volodymyr Nemirniy", "22.06.2025")); + manager.addUser(new User(2, "Alex Novakov", "18.04.2024")); + manager.addUser(new User(3, "Nastya Mirnaya", "06.01.2022")); + manager.addUser(new User(4, "Marina Bro", "08.08.2025")); + + manager.getUsers(); + } + + private record User(long userId, String fullName, String registrationDate) { + } + + private static class UserManager { + private final Map users = new HashMap<>(); + + public void addUser(User user) { + users.put(user.fullName(), user); + } + + public void getUsers() { + for (Map.Entry entry : users.entrySet()) { + System.out.println("Пользователь @" + entry.getKey() + ", полное имя: " + entry.getValue().fullName()); + } + } } } diff --git "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" index a79ebdb..d973dbe 100644 --- "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" +++ "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" @@ -2,6 +2,50 @@ public class Solution { public static void main(String[] args) { + ProductManager manager = new ProductManager(); + manager.addProduct(new Product("1", "Айфон")); + manager.addProduct(new Product("1", "Айфон")); + manager.addProduct(new Product("2", "Ноутбук")); + + manager.showProducts(); + } + + public record Product(String productId, String name) { + + @Override + public String toString() { + return "Product{" + + "productId='" + productId + '\'' + + ", name='" + name + '\'' + + '}'; + } + + @Override + public int hashCode() { + return Objects.hash(productId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Product other)) return false; + + return Objects.equals(this.productId, other.productId); + } + } + + public class ProductManager { + private final Map products = new HashMap<>(); + + public void addProduct(Product product) { + products.put(product, products.getOrDefault(product, 0) + 1); + } + + public void showProducts() { + for (Map.Entry entry : products.entrySet()) { + System.out.println(entry.getKey() + " " + entry.getValue()); + } + } } } diff --git "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" index 042ec02..b2be463 100644 --- "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" +++ "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" @@ -2,6 +2,41 @@ public class Solution { public static void main(String[] args) { + List lists = new ArrayList<>( + List.of( + "Bohemian Rhapsody - Rock", + "Smells Like Teen Spirit - Rock", + "Shape of You - Pop", + "Blinding Lights - Pop", + "The - Hills - Pop", + "Lose Yourself - Hip-Hop" + ) + ); + Map> listMap = new HashMap<>(); + + for (String list : lists) { + int lastSpaceIndex = list.lastIndexOf(" - "); + + if (lastSpaceIndex == -1) { + System.out.println("Last word: " + list); + } else { + String name = list.substring(0, lastSpaceIndex); + String genre = list.substring(lastSpaceIndex + 3); + + if (listMap.containsKey(genre)) { + listMap.get(genre).add(name); + } else { + List songs = new ArrayList<>(); + songs.add(name); + + listMap.put(genre, songs); + } + } + } + + for (Map.Entry> entry : listMap.entrySet()) { + System.out.println(entry.getKey() + ": " + entry.getValue()); + } } } diff --git "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" index dce05aa..23c3dcf 100644 --- "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" +++ "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" @@ -2,6 +2,39 @@ public class Solution { public static void main(String[] args) { + String text = "Занятия спортом — один из наиболее доступных и простых способов укрепить свое здоровье, " + + "продлить себе жизнь и вообще изменить самого себя в лучшую сторону. Большинство людей относится к физическим упражнениям либо со скепсисом(«да ладно, ничего серьезного они мне не дадут»), либо с некоторым пренебрежением («оно, конечно, хорошо, но других дел хватает»)\n" + + "На самом же деле ежедневные занятия спортом, даже на протяжении получаса, способны оказать значительное воздействие на физическое и психологическое состояние человека.\n" + + "Давайте просто зададимся вопросом: «А что такое занятия спортом?». Разумеется, речь не идет о большом спорте, который становится для его участников профессией. Там и нагрузки бывают запредельными, и допинг участники соревнований, если говорить честно, используют регулярно. Но это работа, которая приносит спортсменам доход и от которой зависит их благосостояние.\n" + + "Мы же сейчас совсем о другом — любительском спорте, который не является главной составляющей жизни, но может быть очень полезным приложением к ней.\n" + + "Если человек начинает заниматься спортом, это мгновенно дает ему один плюс — он тренирует свою дисциплинированность. Невозможно ежедневно (или несколько раз в неделю) посвящать свое время некоторому занятию и при этом не контролировать свое поведение.\n" + + "Приходится следить за тем, чтобы на спорт оставалось время (нередко это строго определенный отрезок в течение дня), чтобы организм был к этим занятиям готов (в совершенно убитом состоянии особо не побегаешь). Да и сам спортивный процесс требует контроля и концентрации.\n" + + "Таким образом, человек, посвящающий даже полчаса своего свободного времени спорту и настроенный делать это продолжительное время, привыкает к дисциплине, к определенным жестким требованиям, пренебречь которыми нельзя. Если у него в остальной жизни с этим наблюдаются какие-либо проблемы, занятия спортом обязательно помогут.\n" + + "Причем это, как вы понимаете, всего лишь косвенная польза, но даже она может иметь огромное значение. Следующий пункт — состояние организма в целом. Современный ритм жизни вынуждает человека проводить огромные периоды времени в позах, которые крайне вредны для нашего здоровья: кто-то слишком много сидит, кому-то приходится подолгу стоять на одном месте, у кого-то естественным положением является буква «зю».\n" + + "Все это приводит к нарушениям кровообращения и другим процессам, которые не всегда заметны в настоящем, но грозят серьезнейшими проблемами в будущем. Да и когда человек отдыхает, он чаще всего лишь усугубляет ситуацию — один, отсидев полный рабочий день за компьютером в офисе, дома продолжает заниматься тем же самым, другой стоит за прилавком в магазине, а, вернувшись домой, стирает вещи, согнувшись в три погибели. И так далее.\n" + + "А наше тело — не идеальный механизм, для него тоже существуют правила эксплуатации, и когда они регулярно и стабильно нарушаются, он начинает очень быстро изнашиваться.\n" + + "Занятия спортом в этом плане — отличное средство изменить ситуацию. Различные упражнения и игры придумывались и оттачивались годами, в них давным-давно сконцентрированы те операции, которые человеку необходимо проделывать со своим организмом, чтобы держать его в тонусе.\n" + + "Вам даже не нужно задумываться над тем, почему вы выполняете то или иное упражнение, просто следуйте рекомендациям. Это как в музыке — не стоит думать о том, почему классическое расположение пальцев на гитаре является наиболее удобным, достаточно просто знать, что это так.".toLowerCase(); + text = text.replaceAll("[^a-zа-яё\\s]", ""); + text = text.replaceAll("\\s+", " "); + text = text.toLowerCase(); + + String[] words = text.split("\\s+"); + Map w = new HashMap<>(); + + for (String word : words) { + if (w.containsKey(word)) { + w.put(word, w.get(word) + 1); + } else { + w.put(word, 1); + } + } + + for (Map.Entry entry : w.entrySet()) { + if (entry.getValue() > 5) { + System.out.println(entry.getKey() + " " + entry.getValue()); + } + } } } diff --git "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" index 57b651f..ab5a190 100644 --- "a/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" +++ "b/src/com/school/faang/hashmap/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" @@ -2,6 +2,63 @@ public class Solution { public static void main(String[] args) { + Tweet tweetOne = new Tweet("@anna", List.of("#java", "#programming")); + Tweet tweetTwo = new Tweet("@ivan", List.of("#java")); + Tweet tweetThree = new Tweet("@ivan", List.of("#java")); + Tweet tweetFour = new Tweet("@ivan", List.of("#java")); + Tweet tweetFive = new Tweet("@ivan", List.of("#java")); + List tweets = List.of(tweetOne, tweetTwo, tweetThree, tweetFour, tweetFive); + + for (Map.Entry entry : findTopAuthors(tweets).entrySet()) { + System.out.println("Хештег: " + entry.getKey() + " → Топ автор: " + entry.getValue()); + } } + + private static Map findTopAuthors(List tweets) { + Map> hashtagStats = new HashMap<>(); + + for (Tweet tweet : tweets) { + String author = tweet.author(); + + for (String hashtag : tweet.hashtags()) { + hashtagStats + .computeIfAbsent(hashtag, _ -> new HashMap<>()) + .merge(author, 1, Integer::sum); + } + } + + Map topAuthors = new HashMap<>(); + + for (Map.Entry> entry : hashtagStats.entrySet()) { + String hashtag = entry.getKey(); + Map authorStats = entry.getValue(); + + String topAuthor = null; + int maxCount = 0; + + for (Map.Entry authorEntry : authorStats.entrySet()) { + if (topAuthor == null || authorEntry.getValue() > maxCount) { + topAuthor = authorEntry.getKey(); + maxCount = authorEntry.getValue(); + } + } + + topAuthors.put(hashtag, topAuthor); + } + + return topAuthors; + } + + public record Tweet(String author, List hashtags) { + + @Override + public String toString() { + return "Tweet{" + + "author='" + author + '\'' + + ", hashtags=" + hashtags + + '}'; + } + } + } diff --git "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" index b00548d..e15e082 100644 --- "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" +++ "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_1/Solution.java" @@ -1,7 +1,52 @@ package com.school.faang.hashset.задача_1; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + public class Solution { public static void main(String[] args) { + EventRegistration registration = new EventRegistration(); + + registration.register("test@gmail.com"); + registration.register("test@gmail.com"); + registration.register("volodymyr@gmail.com"); + registration.register("quikkkk@gmail.com"); + + System.out.println(registration.getParticipantCount()); + System.out.println(registration.isRegistered("volodymyr@gmail.com")); + } + + private static class EventRegistration { + private final Set registeredEmails = new HashSet<>(); + + public void register(String email) { + if (registeredEmails.contains(email)) { + System.out.println("Ошибка: пользователь с email '" + email + "' уже зарегистрирован."); + return; + } + + registeredEmails.add(email); + System.out.println("Регистрация для '" + email + "' прошла успешно!"); + } + + public int getParticipantCount() { + return registeredEmails.size(); + } + + public String isRegistered(String email) { + return registeredEmails.contains(email) ? email + ", зарегистрирован в системе" : "Не существует"; + } + + public Set getRegisteredEmails() { + return Collections.unmodifiableSet(registeredEmails); + } + @Override + public String toString() { + return "EventRegistration{" + + "registeredEmails=" + registeredEmails + + '}'; + } } } diff --git "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" index d5e428d..0d9cea4 100644 --- "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" +++ "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_2/Solution.java" @@ -1,7 +1,60 @@ package com.school.faang.hashset.задача_2; +import java.util.HashSet; +import java.util.Set; + public class Solution { public static void main(String[] args) { + UserBlackList blackList = new UserBlackList(); + + blackList.blockUser("alice"); + blackList.blockUser("bob"); + blackList.blockUser("alice"); + + System.out.println("Is bob blocked? " + blackList.isUserBlocked("bob")); + + blackList.unblockUser("bob"); + System.out.println("Is bob blocked? " + blackList.isUserBlocked("bob")); + + blackList.blockUser(null); + System.out.println("Is null blocked? " + blackList.isUserBlocked(null)); + blackList.unblockUser(null); + + System.out.println("Is null blocked? " + blackList.isUserBlocked(null)); + } + + private static class UserBlackList { + private final Set blockedUsers = new HashSet<>(); + + public void blockUser(String username) { + if (blockedUsers.contains(username)) { + System.out.println("This user is already blocked"); + return; + } + + blockedUsers.add(username); + System.out.println("User " + username + " is blocked"); + } + + public void unblockUser(String username) { + if (!blockedUsers.contains(username)) { + System.out.println("This user is not blocked"); + return; + } + + blockedUsers.remove(username); + System.out.println("User " + username + " is unblocked"); + } + + public boolean isUserBlocked(String username) { + return blockedUsers.contains(username); + } + @Override + public String toString() { + return "UserBlackList{" + + "blockedUsers=" + blockedUsers + + '}'; + } } } diff --git "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" index 3b56bed..aea0ea3 100644 --- "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" +++ "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_3/Solution.java" @@ -1,7 +1,31 @@ package com.school.faang.hashset.задача_3; +import java.util.HashSet; +import java.util.Set; + public class Solution { public static void main(String[] args) { + HashSet userOneContacts = new HashSet<>(); + + userOneContacts.add("Володька"); + userOneContacts.add("Саня завод"); + userOneContacts.add("Лизка 1500 руб"); + + HashSet userTwoContacts = new HashSet<>(); + userTwoContacts.add("Володька"); + userTwoContacts.add("Лизка 1500 руб"); + userTwoContacts.add("Андрюха пиво"); + + Set mutualContacts = MutualContactsFinder.findMutualContacts(userOneContacts, userTwoContacts); + System.out.println("Общие контакты (" + mutualContacts.size() + "): " + mutualContacts); + } + + private static class MutualContactsFinder { + public static Set findMutualContacts(HashSet contactsOne, HashSet contactsTwo) { + Set newContacts = new HashSet<>(contactsTwo); + newContacts.retainAll(contactsOne); + return newContacts; + } } } diff --git "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" index 48b57c8..cdfbdcf 100644 --- "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" +++ "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_4/Solution.java" @@ -1,7 +1,61 @@ package com.school.faang.hashset.задача_4; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + public class Solution { public static void main(String[] args) { + ChannelManager manager = new ChannelManager(); + + manager.addUser("id123", "админ"); + manager.addUser("id456", "модератор"); + manager.addUser("id789", "участник"); + + System.out.println(manager.hasUser("id123")); + System.out.println(manager.getRole("id123")); + + manager.removeUser("id123"); + System.out.println(manager.hasUser("id123")); + System.out.println(manager.getRole("id123")); + } + + private static class ChannelManager { + private final Set members = new HashSet<>(); + private final Map memberRoles = new HashMap<>(); + + public void addUser(String userId, String role) { + if (userId == null || role == null) return; + if (members.contains(userId)) return; + + members.add(userId); + memberRoles.put(userId, role); + } + + public void removeUser(String userId) { + members.remove(userId); + memberRoles.remove(userId); + } + + public String getRole(String userId) { + if (!members.contains(userId)) { + return "Не является участником"; + } + + return memberRoles.get(userId); + } + + public boolean hasUser(String userId) { + return members.contains(userId); + } + @Override + public String toString() { + return "ChannelManager{" + + "members=" + members + + ", memberRoles=" + memberRoles + + '}'; + } } } diff --git "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" index 38f2c78..d829ed5 100644 --- "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" +++ "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_5/Solution.java" @@ -1,7 +1,102 @@ package com.school.faang.hashset.задача_5; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; +import java.util.Set; + public class Solution { public static void main(String[] args) { + GameLobby lobby = new GameLobby(); + + lobby.addPlayer("Player1"); + lobby.addPlayer("Player2"); + lobby.addPlayer("Player3"); + + lobby.addPlayer("Player2"); + System.out.println("Список игроков:"); + lobby.displayPlayers(); + + System.out.println("Player2 в лобби? " + lobby.hasPlayer("Player2")); + System.out.println("Player4 в лобби? " + lobby.hasPlayer("Player4")); + + lobby.removePlayer("Player2"); + System.out.println("Список игроков:"); + lobby.displayPlayers(); + } + + private static class Player { + private final String nickname; + private String status = "Не готов"; + + public Player(String nickname, String status) { + this.nickname = nickname; + this.status = status; + } + + public String getNickname() { + return nickname; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public int hashCode() { + return Objects.hash(nickname); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Player other)) return false; + + return Objects.equals(nickname, other.nickname); + } + + @Override + public String toString() { + return "Player{" + + "nickname='" + nickname + '\'' + + ", status='" + status + '\'' + + '}'; + } + } + + private static class GameLobby { + private final Set players = new HashSet<>(); + private final List playerJoinOrder = new LinkedList<>(); + + public void addPlayer(String nickname) { + Player tempPlayer = new Player(nickname, "Не готов"); + if (players.contains(tempPlayer)) return; + + players.add(tempPlayer); + playerJoinOrder.add(tempPlayer); + } + + public void removePlayer(String nickname) { + Player tempPlayer = new Player(nickname, "Не готов"); + + players.remove(tempPlayer); + playerJoinOrder.remove(tempPlayer); + } + + public boolean hasPlayer(String nickname) { + Player tempPlayer = new Player(nickname, "Не готов"); + return players.contains(tempPlayer); + } + public void displayPlayers() { + for (Player player : playerJoinOrder) { + System.out.println(player); + } + } } } diff --git "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" index 063689d..0ca5bbf 100644 --- "a/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" +++ "b/src/com/school/faang/hashset/\320\267\320\260\320\264\320\260\321\207\320\260_6/Solution.java" @@ -1,7 +1,65 @@ package com.school.faang.hashset.задача_6; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class Solution { public static void main(String[] args) { + RecommendationEngine engine = new RecommendationEngine(); + + engine.addVideo("Channel 1", "Title 1"); + engine.addVideo("Channel 1", "Title 2"); + engine.addVideo("Channel 3", "Title 3"); + engine.addVideo("Channel 3", "Title 4"); + engine.addVideo("Channel 4", "Title 5"); + engine.addVideo("Channel 5", "Title 6"); + + Set subscriptions = new HashSet<>(Arrays.asList("Channel 1", "Channel 3")); + Set watchHistory = new HashSet<>(Collections.singletonList("Title 1")); + + List feed = engine.generateFeed(subscriptions, watchHistory); + System.out.println("Рекомендации для пользователя: "); + for (String video : feed) { + System.out.println(video); + } + + System.out.println("\nПовторный запуск: "); + feed = engine.generateFeed(subscriptions, watchHistory); + + for (String video : feed) { + System.out.println(video); + } + } + + private static class RecommendationEngine { + private final Map> videosByChannel = new HashMap<>(); + + public void addVideo(String channelName, String videoTitle) { + videosByChannel.computeIfAbsent(channelName, _ -> new HashSet<>()).add(videoTitle); + } + + public List generateFeed(Set subscriptions, Set watchHistory) { + Set recommendations = new HashSet<>(); + + for (String channel : subscriptions) { + Set videos = videosByChannel.get(channel); + + if (videos != null) { + recommendations.addAll(videos); + } + } + + recommendations.removeAll(watchHistory); + ArrayList finalFeed = new ArrayList<>(recommendations); + Collections.shuffle(finalFeed); + return finalFeed; + } } }