Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- public class TreeTask {
- public static HashMap<String,HashSet<String>> mailMap = new HashMap<>();
- public static ArrayList<HashSet<String>> twinks = new ArrayList<>();
- public static HashMap<String,HashSet<String>> userMap = new HashMap<>();
- /**
- * добавление емэйлов и юзеров в 2 мапы. у одной ключ - никнейм и значение - список мэйлов
- * у другой ключ мэйл и значение - список юзеров которым принадежит данный мэйл
- * по ней мы будем собирать в кучу все мэйлы одного юзера
- * @param user никнейм
- * @param email мэйл
- */
- private void addUserWithEmail(String user, String email) {
- HashSet<String> userList = mailMap.get(email);
- HashSet<String> mailList = userMap.get(user);
- if(userList == null)
- mailMap.put(email, new HashSet<String>());
- if(mailList == null)
- userMap.put(user, new HashSet<String>());
- mailMap.get(email).add(user);
- userMap.get(user).add(email);
- }
- /**
- * объединение аккаунтов с пересекающимися мэйлами (твинков)
- * */
- private void merge() {
- // собираем в кучу все емэйлы каждого юзера
- for (String key : mailMap.keySet()) { // перебираем мапу которая отражает мэйлы и список юзеров которым
- //данный принадлежит мэйл
- if (mailMap.get(key).size() > 1) { // если нашли мэйл на котором завязаны несколько юзеров
- boolean merged = false; // ставим флаг что мы не определяли его в список твинков
- for (int i = 0; i < twinks.size(); i++) {
- // ищем по списку твинков,
- // не является ли мэйлы еще несколькими твинками другого юзера, который уже есть в базе твинков
- //смотрим пересечение коллекций
- Collection common = (Collection) twinks.get(i).clone();
- common.retainAll(mailMap.get(key));
- if (common.size() > 0) { //если нашли хоть один общий
- twinks.get(i).addAll(mailMap.get(key)); // объединяем найденые мэйлы с существующим акком
- merged = true; // ставим флаг, что нашли чьи то мэйлы
- }
- }
- if (!merged) { //если не нашли кому принадлежат мэйлы, то это новый акк, добавляем его
- twinks.add(new HashSet<>(mailMap.get(key)));
- }
- }
- }
- //объединяем все твинки в один, дописывая мэйлы остальных твинков к первому
- for (HashSet<String> elem : twinks) {
- //т.к. хэшсет позволяет перебирать себя только итераторами,
- //придется немного подпортить код
- String first = "";
- boolean first_flag = true;
- for(String el_key : elem) {
- if(first_flag) {
- first = el_key;
- } else {
- userMap.get(first).addAll(userMap.get(el_key));
- userMap.remove(el_key);
- }
- first_flag = false;
- }
- }
- }
- /**
- * Печать мультимапа
- * @param printMap мап который надо напечатать
- */
- private void printAll(HashMap<String, HashSet<String>> printMap) {
- for(String el : printMap.keySet()) {
- HashSet<String> elems = printMap.get(el);
- System.out.printf("%s: " ,el);
- for(String sub_el : elems)
- System.out.printf("%s; ", sub_el);
- System.out.println();
- }
- }
- public void load() {
- //добавляем мэйлы
- addUserWithEmail("user1","aaaa@mail.ru");
- addUserWithEmail("user2","bbbb@mail.ru");
- addUserWithEmail("user1","aaaa111@mail.ru");
- addUserWithEmail("user3","ccc@mail.ru");
- addUserWithEmail("user3","aaaa111@mail.ru");
- addUserWithEmail("user1_duplicate","aaaa@mail.ru");
- addUserWithEmail("user1_duplicate","kkk@mail.ru");
- addUserWithEmail("user1_duplicate","zzz@mail.ru");
- addUserWithEmail("user2","kkk@mail.ru");
- addUserWithEmail("user4","tttt@mail.ru");
- addUserWithEmail("user4","nnnn@mail.ru");
- addUserWithEmail("user4","gggg@mail.ru");
- addUserWithEmail("user5","yyyy@mail.ru");
- addUserWithEmail("user5","pppp@mail.ru");
- addUserWithEmail("user6","qqqq@mail.ru");
- addUserWithEmail("user6","rrrr@mail.ru");
- addUserWithEmail("user6","asfw@mail.ru");
- addUserWithEmail("user6","tttt@mail.ru");
- addUserWithEmail("user7","zxcv@mail.ru");
- merge();
- printAll(userMap); //печатаем результат
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement