Advertisement
Guest User

Untitled

a guest
Jul 28th, 2018
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.56 KB | None | 0 0
  1.  
  2. import java.util.*;
  3.  
  4. public class TreeTask {
  5.  
  6.  
  7.     public static HashMap<String,HashSet<String>> mailMap = new HashMap<>();
  8.     public static ArrayList<HashSet<String>> twinks = new ArrayList<>();
  9.     public static HashMap<String,HashSet<String>> userMap = new HashMap<>();
  10.  
  11.     /**
  12.      * добавление емэйлов и юзеров в 2 мапы. у одной ключ - никнейм и значение - список мэйлов
  13.      * у другой ключ мэйл и значение - список юзеров которым принадежит данный мэйл
  14.      * по ней мы будем собирать в кучу все мэйлы одного юзера
  15.      * @param user никнейм
  16.      * @param email мэйл
  17.      */
  18.  
  19.     private void addUserWithEmail(String user, String email) {
  20.         HashSet<String> userList = mailMap.get(email);
  21.         HashSet<String> mailList = userMap.get(user);
  22.         if(userList == null)
  23.             mailMap.put(email, new HashSet<String>());
  24.  
  25.         if(mailList == null)
  26.             userMap.put(user, new HashSet<String>());
  27.  
  28.         mailMap.get(email).add(user);
  29.         userMap.get(user).add(email);
  30.     }
  31.  
  32.     /**
  33.      * объединение аккаунтов с пересекающимися мэйлами (твинков)
  34.      * */
  35.     private void merge() {
  36.         // собираем в кучу все емэйлы каждого юзера
  37.         for (String key : mailMap.keySet()) { // перебираем мапу которая отражает мэйлы и список юзеров которым
  38.             //данный принадлежит мэйл
  39.  
  40.             if (mailMap.get(key).size() > 1) { // если нашли мэйл на котором завязаны несколько юзеров
  41.  
  42.                 boolean merged = false; // ставим флаг что мы не определяли его в список твинков
  43.  
  44.                 for (int i = 0; i < twinks.size(); i++) {
  45.                     // ищем по списку твинков,
  46.                     // не является ли мэйлы еще несколькими твинками другого юзера, который уже есть в базе твинков
  47.  
  48.                     //смотрим пересечение коллекций
  49.                     Collection common = (Collection) twinks.get(i).clone();
  50.                     common.retainAll(mailMap.get(key));
  51.  
  52.                     if (common.size() > 0) { //если нашли хоть один общий
  53.                         twinks.get(i).addAll(mailMap.get(key)); // объединяем найденые мэйлы с существующим акком
  54.                         merged = true; // ставим флаг, что нашли чьи то мэйлы
  55.                     }
  56.                 }
  57.                 if (!merged) { //если не нашли кому принадлежат мэйлы, то это новый акк, добавляем его
  58.                     twinks.add(new HashSet<>(mailMap.get(key)));
  59.                 }
  60.             }
  61.         }
  62.  
  63.         //объединяем все твинки в один, дописывая мэйлы остальных твинков к первому
  64.         for (HashSet<String> elem : twinks) {
  65.             //т.к. хэшсет позволяет перебирать себя только итераторами,
  66.             //придется немного подпортить код
  67.             String first = "";
  68.             boolean first_flag = true;
  69.             for(String el_key : elem) {
  70.                 if(first_flag) {
  71.                     first = el_key;
  72.                 } else {
  73.                     userMap.get(first).addAll(userMap.get(el_key));
  74.                     userMap.remove(el_key);
  75.                 }
  76.                 first_flag = false;
  77.             }
  78.         }
  79.     }
  80.  
  81.     /**
  82.      * Печать мультимапа
  83.      * @param printMap мап который надо напечатать
  84.      */
  85.     private void printAll(HashMap<String, HashSet<String>> printMap) {
  86.         for(String el : printMap.keySet()) {
  87.             HashSet<String> elems = printMap.get(el);
  88.             System.out.printf("%s: " ,el);
  89.             for(String sub_el : elems)
  90.                 System.out.printf("%s; ", sub_el);
  91.             System.out.println();
  92.         }
  93.     }
  94.  
  95.     public void load() {
  96.         //добавляем мэйлы
  97.         addUserWithEmail("user1","aaaa@mail.ru");
  98.         addUserWithEmail("user2","bbbb@mail.ru");
  99.         addUserWithEmail("user1","aaaa111@mail.ru");
  100.         addUserWithEmail("user3","ccc@mail.ru");
  101.         addUserWithEmail("user3","aaaa111@mail.ru");
  102.         addUserWithEmail("user1_duplicate","aaaa@mail.ru");
  103.         addUserWithEmail("user1_duplicate","kkk@mail.ru");
  104.         addUserWithEmail("user1_duplicate","zzz@mail.ru");
  105.         addUserWithEmail("user2","kkk@mail.ru");
  106.  
  107.         addUserWithEmail("user4","tttt@mail.ru");
  108.         addUserWithEmail("user4","nnnn@mail.ru");
  109.         addUserWithEmail("user4","gggg@mail.ru");
  110.  
  111.         addUserWithEmail("user5","yyyy@mail.ru");
  112.         addUserWithEmail("user5","pppp@mail.ru");
  113.  
  114.         addUserWithEmail("user6","qqqq@mail.ru");
  115.         addUserWithEmail("user6","rrrr@mail.ru");
  116.         addUserWithEmail("user6","asfw@mail.ru");
  117.  
  118.         addUserWithEmail("user6","tttt@mail.ru");
  119.         addUserWithEmail("user7","zxcv@mail.ru");
  120.        
  121.         merge();
  122.         printAll(userMap); //печатаем результат
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement