Viksy

PersonCollection

May 4th, 2022
1,229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.27 KB | None | 0 0
  1. import java.util.*;
  2. import java.util.stream.Collectors;
  3.  
  4.  
  5. public class PersonCollectionImpl implements PersonCollection {
  6.     static class PeopleEmailSorted {
  7.         TreeMap<String, Person> people = new TreeMap<>();
  8.  
  9.         public void add(Person person){
  10.             people.put(person.getEmail(), person);
  11.         }
  12.  
  13.         public void remove(Person person){
  14.             people.remove(person.getEmail());
  15.         }
  16.  
  17.         public List<Person> getSorted(){
  18.             List<Person> sorted = new ArrayList<>();
  19.             for (Map.Entry<String, Person> entry : people.entrySet()) {
  20.                 sorted.add(entry.getValue());
  21.             }
  22.             return sorted;
  23.         }
  24.     }
  25.  
  26.     static class NameTownKey {
  27.         final String name;
  28.         final String town;
  29.  
  30.         public NameTownKey(String name, String town) {
  31.             this.name = name;
  32.             this.town = town;
  33.         }
  34.  
  35.         @Override
  36.         public int hashCode() {
  37.             return name.hashCode() + 73 * town.hashCode();
  38.         }
  39.  
  40.         @Override
  41.         public boolean equals(Object obj){
  42.             if(!(obj instanceof NameTownKey)){
  43.                 return false;
  44.             }
  45.  
  46.             NameTownKey other = (NameTownKey) obj;
  47.             return this.name.equals(other.name) && this.town.equals(other.town);
  48.         }
  49.     }
  50.  
  51.     private Map<String, Person> peopleByEmail;
  52.  
  53.     //indices
  54.     private Map<String, PeopleEmailSorted> peopleByEmailDomain;
  55.     private Map<NameTownKey, PeopleEmailSorted> peopleByNameAndTown;
  56.     private Map<String, TreeMap<Integer, PeopleEmailSorted>> peopleByAgeAndTown;
  57.  
  58.     public PersonCollectionImpl(){
  59.         this.peopleByEmail = new HashMap<>();
  60.         this.peopleByEmailDomain = new HashMap<>();
  61.         this.peopleByNameAndTown = new HashMap<>();
  62.         this.peopleByAgeAndTown = new HashMap<>();
  63.     }
  64.  
  65.     @Override
  66.     public boolean add(String email, String name, int age, String town) {
  67.         if(this.peopleByEmail.containsKey(email)){
  68.             return false;
  69.         }
  70.  
  71.         Person person = new Person(email, name, age, town);
  72.         this.peopleByEmail.put(email, person);
  73.  
  74.         addToIndices(person);
  75.  
  76.         return true;
  77.     }
  78.  
  79.     @Override
  80.     public int getCount() {
  81.         return this.peopleByEmail.size();
  82.     }
  83.  
  84.     @Override
  85.     public boolean delete(String email) {
  86.         Person deletedPerson = this.peopleByEmail.remove(email);
  87.  
  88.         if(deletedPerson != null){
  89.             removeFromIndices(deletedPerson);
  90.             return true;
  91.         }
  92.  
  93.         return false;
  94.     }
  95.  
  96.     @Override
  97.     public Person find(String email) {
  98.         return peopleByEmail.get(email);
  99.     }
  100.  
  101.  
  102.     @Override
  103.     public Iterable<Person> findAll(String emailDomain) {
  104.         if(emailDomain == null){
  105.             return new ArrayList<>();
  106.         }
  107.  
  108.         PeopleEmailSorted peopleEmailSorted =  this.peopleByEmailDomain.get(emailDomain);
  109.         if(peopleEmailSorted == null){
  110.             return new ArrayList<>();
  111.         }
  112.  
  113.         return peopleEmailSorted.getSorted();
  114.     }
  115.  
  116.     @Override
  117.     public Iterable<Person> findAll(String name, String town) {
  118.         if(name == null || town == null){
  119.             return new ArrayList<>();
  120.         }
  121.  
  122.         PeopleEmailSorted peopleEmailSorted = this.peopleByNameAndTown.get(new NameTownKey(name, town));
  123.         if(peopleEmailSorted == null){
  124.             return new ArrayList<>();
  125.         }
  126.  
  127.         return peopleEmailSorted.getSorted();
  128.     }
  129.  
  130.     @Override
  131.     public Iterable<Person> findAll(int startAge, int endAge) {
  132.         return this.peopleByEmail.values().stream()
  133.                 .filter(person -> person.getAge() >= startAge && person.getAge() <= endAge)
  134.                 .sorted(Comparator.comparingInt(Person::getAge).thenComparing(Person::getEmail))
  135.                 .collect(Collectors.toList());
  136.     }
  137.  
  138.     @Override
  139.     public Iterable<Person> findAll(int startAge, int endAge, String town) {
  140. //        if(town == null){
  141. //            return new ArrayList<>();
  142. //        }
  143. //
  144. //        List<Person> people = new ArrayList<>();
  145. //        TreeMap<Integer, PeopleEmailSorted> peopleFromTown = peopleByAgeAndTown.get(town);
  146. //        for (Map.Entry<Integer, PeopleEmailSorted> entry : peopleFromTown.entrySet()) {
  147. //            if(entry.getKey() >= startAge && entry.getKey() <= endAge){
  148. //                people.addAll(entry.getValue().getSorted());
  149. //            }
  150. //        }
  151. //        return people;
  152.         return this.peopleByEmail.values().stream()
  153.                 .filter(person -> (person.getAge() >= startAge && person.getAge() <= endAge) && person.getTown().equals(town))
  154.                 .sorted(Comparator.comparingInt(Person::getAge).thenComparing(Person::getEmail))
  155.                 .collect(Collectors.toList());
  156.     }
  157.  
  158.     private void addToIndices(Person person) {
  159.         //By Email Domain
  160.         String domain = getDomain(person);
  161.         PeopleEmailSorted peopleEmailSorted = peopleByEmailDomain.get(domain);
  162.         if(peopleEmailSorted == null){
  163.             peopleEmailSorted = new PeopleEmailSorted();
  164.             peopleByEmailDomain.put(domain, peopleEmailSorted);
  165.         }
  166.         peopleEmailSorted.add(person);
  167.  
  168.         //By Name And Town
  169.         NameTownKey nameTownKey = new NameTownKey(person.getName(), person.getTown());
  170.         PeopleEmailSorted peopleByNameAndTownSorted = peopleByNameAndTown.get(nameTownKey);
  171.         if(peopleByNameAndTownSorted == null){
  172.             peopleByNameAndTownSorted = new PeopleEmailSorted();
  173.             peopleByNameAndTown.put(nameTownKey, peopleByNameAndTownSorted);
  174.         }
  175.         peopleByNameAndTownSorted.add(person);
  176.  
  177.         //By Age And Town
  178. //        TreeMap<Integer, PeopleEmailSorted> peopleByAgeAndTownSorted = peopleByAgeAndTown.get(person.getTown());
  179. //        if(peopleByAgeAndTownSorted == null){
  180. //            peopleByAgeAndTownSorted = new TreeMap<>();
  181. //            peopleByAgeAndTownSorted.put(person.getAge(), new PeopleEmailSorted());
  182. //            peopleByAgeAndTown.put(person.getTown(), peopleByAgeAndTownSorted);
  183. //        }
  184. //        peopleByAgeAndTownSorted.get(person.getAge()).add(person);
  185.         // TODO: add to other indices
  186.     }
  187.  
  188.     private void removeFromIndices(Person person) {
  189.         //By Email Domain
  190.         String domain = getDomain(person);
  191.         PeopleEmailSorted peopleEmailSorted = peopleByEmailDomain.get(domain);
  192.         if(peopleEmailSorted != null){
  193.             peopleEmailSorted.remove(person);
  194.         }
  195.  
  196.         //By Name And Town
  197.         NameTownKey nameTownKey = new NameTownKey(person.getName(), person.getTown());
  198.         PeopleEmailSorted peopleByNameAndTownSorted = peopleByNameAndTown.get(nameTownKey);
  199.         if(peopleByNameAndTownSorted != null){
  200.             peopleByNameAndTownSorted.remove(person);
  201.         }
  202.  
  203. //        //By Age And Town
  204. //        TreeMap<Integer, PeopleEmailSorted> peopleByAgeAndTownSorted = peopleByAgeAndTown.get(person.getTown());
  205. //        if(peopleByAgeAndTownSorted != null){
  206. //            peopleByAgeAndTownSorted.get(person.getAge()).remove(person);
  207. //        }
  208.  
  209.         // TODO: remove from other indices
  210.  
  211.     }
  212.  
  213.     private String getDomain(Person person){
  214.         return person.getEmail().substring(person.getEmail().lastIndexOf('@') + 1);
  215.     }
  216. }
  217.  
Advertisement
Add Comment
Please, Sign In to add comment