package com.interview.books.fgdsb; import com.interview.books.question300.TQ2_UnionFind; import java.util.*; /** * Created_By: stefanie * Date: 15-2-2 * Time: 上午10:21 */ public class NLC10_GroupContacts { class Contact{ String name; List<String> emails; public Contact(String name, String... emails){ this.name = name; this.emails = Arrays.asList(emails); } } public List<List<Contact>> group(List<Contact> contacts){ Map<String, List<Integer>> emailMap = new HashMap(); for(int i = 0; i < contacts.size(); i++){ for(String email : contacts.get(i).emails){ if(emailMap.containsKey(email)){ emailMap.get(email).add(i); } else { List<Integer> idx = new ArrayList(); idx.add(i); emailMap.put(email, idx); } } } TQ2_UnionFind uf = new TQ2_UnionFind(contacts.size()); for(List<Integer> group : emailMap.values()){ for(int i = 0; i < group.size() - 1; i++){ uf.connected(group.get(i), group.get(i + 1)); } } Map<Integer, List<Integer>> groupIdx = new HashMap(); for(int i = 0; i < contacts.size(); i++){ int p = uf.find(i); if(groupIdx.containsKey(p)) groupIdx.get(p).add(i); else { List<Integer> idx = new ArrayList(); idx.add(i); groupIdx.put(p, idx); } } List<List<Contact>> groups = new ArrayList(); for(List<Integer> group : groupIdx.values()){ List<Contact> contactGroup = new ArrayList(); for(Integer idx : group) contactGroup.add(contacts.get(idx)); groups.add(contactGroup); } return groups; } }