Filip_Markoski

Contacts again

Dec 22nd, 2017
607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.48 KB | None | 0 0
  1.  
  2. import java.lang.reflect.Array;
  3. import java.text.DecimalFormat;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.time.LocalDate;
  7. import java.util.*;
  8. import java.util.stream.Collectors;
  9. import java.util.stream.IntStream;
  10.  
  11. /**
  12.  * * * * * * * *
  13.  * Description *
  14.  * * * * * * * *
  15.  * Се со цел да се подобри комуникацијата на факултетот потребно е
  16.  * да се направи систем за чување на контакти за секој студент.
  17.  * Да се креира класа Contact. За потребите на оваа класа да се
  18.  * дефинираат следниве методи:
  19.  * * Contact(String date) - конструктор каде што date е датумот
  20.  * кога е креиран контактот даден во следниов формат
  21.  * YYYY-MM-DD
  22.  * * isNewerThan(Contact c):boolean - метод кој враќа true доколку
  23.  * контактот е креиран подоцна од контактот c и обратно
  24.  * * getType():String - метод кој враќа вредност "Email" или
  25.  * "Phone" во зависност од типот на контактот
  26.  * Од класата Contact не треба да може директно да се инстанцира
  27.  * објект.
  28.  * Од оваа класа се изведуваат класите EmailContact и PhoneContact.
  29.  * За класата EmailContact дополнително се чува e-маил кој што е од
  30.  * типот String. Да се дефинираат следниве методи:
  31.  * * EmailContact(String date, String email) - конструктор
  32.  * * getEmail():String - метод кој што го враќа е-маилот
  33.  * * getType():String- имплементација на методот од класата
  34.  * Contact
  35.  * За класата PhoneContact дополнително се чува телефонски број кој
  36.  * што е од типот String и оператор кој што е енумерација и се
  37.  * дефинира на следниов начин enum Operator { VIP, ONE, TMOBILE }.
  38.  * За оваа класа да се дефинираат следниве методи:
  39.  * * PhoneContact(String date, String phone) - конструктор
  40.  * * getPhone():String - метод кој што го враќа телефонскиот број
  41.  * * getOperator():Operator - метод кој што го враќа операторот
  42.  * (070, 071, 072 – TMOBILE, 075,076 – ONE, 077, 078 – VIP)
  43.  * * getType():String- имплементација на методот од класата
  44.  * Contact
  45.  * *Забелешка: Сите телефонски броеви се во формат 07X/YYY-ZZZ каде
  46.  * што X има вредност {0,1,2,5,6,7,8}
  47.  * Потоа да се дефинира класата Student каде што се чува низа на
  48.  * контакти за секој студент
  49.  * * Student(String firstName, String lastName, String city, int age, long index)
  50.  * – конструктор
  51.  * * addEmailContact(String date, String email):void – метод што
  52.  * додава е-маил контакт во низата на контакти
  53.  * * addPhoneContact(String date, String phone):void – метод што
  54.  * додава телефонски контакт во низата на контакти
  55.  * * getEmailContacts():Contact[] – враќа низа на email
  56.  * контактите на студентот
  57.  * * getPhoneContacts():Contact[] – враќа низа на phone
  58.  * контактите на студентот
  59.  * * getCity():String - метод кој го враќа градот
  60.  * * getFullName():String - метод кој го враќа целосното име на
  61.  * студентот во формат IME PREZIME
  62.  * * getIndex():long - метод кој го враќа индексот на студентот
  63.  * * getLatestContact():Contact – го враќа најновиот контакт
  64.  * (според датум) од студентот
  65.  * * toString() – претставува JSON репрезентација на класата
  66.  * студент пр.
  67.  * {"ime":"Jovan", "prezime":"Jovanov", "vozrast":20, "grad":"Skopje", "indeks":101010,
  68.  * "telefonskiKontakti":["077/777-777", "078/888-888"], "emailKontakti":["[email protected]", "[email protected]", "[email protected]"]}
  69.  * *Забелешка: Во класата Student да се чува само една низа од
  70.  * контакти Contact[], а не две низи одделно (PhoneContact[] и
  71.  * EmailContact[])
  72.  * *Напомена да не се користи instanceOf или getClass при
  73.  * имплементација на овие методи
  74.  * Дополнително да се дефинира класа Faculty. За оваа класа да се
  75.  * дефинираат следниве методи:
  76.  * * Faculty(String name, Student [] students) – конструктор
  77.  * * countStudentsFromCity(String cityName):int – враќа колку
  78.  * студенти има од даден град
  79.  * * getStudent(long index):Student – метод кој го враќа студентот
  80.  * кој го има дадениот индекс
  81.  * * getAverageNumberOfContacts():double – враќа просечен број на
  82.  * контакти по студент
  83.  * * getStudentWithMostContacts():Student – метод кој го враќа
  84.  * студентот со најмногу контакти (доколку има повеќе студенти
  85.  * со ист број на контакти да го врати студентот со најголем
  86.  * индекс)
  87.  * * toString() – претставува JSON репрезентација на класата
  88.  * Faculty пример:
  89.  * {"fakultet":"FINKI", "studenti":[STUDENT1, STUDENT2, ...]}
  90.  * каде што треба да има целосни информации за секој студент.
  91.  * * * * * * * * *
  92.  * Sample Input  *
  93.  * * * * * * * * *
  94.  * 4
  95.  * CREATE_FACULTY Ekonomski fakultet
  96.  * 3
  97.  * Sanja Mihova Skopje 21 82907017
  98.  * Emil Stankov Bitola 29 43009931
  99.  * Emil Trajanov Bitola 29 24914336
  100.  * ADD_EMAIL_CONTACT 82907017 2012-04-10 [email protected]
  101.  * ADD_PHONE_CONTACT 82907017 2010-03-05 070/744-235
  102.  * CHECK_SIMPLE
  103.  * * * * * * * * *
  104.  * Sample Output *
  105.  * * * * * * * * *
  106.  * Average number of contacts: 0.67
  107.  * Number of students from Skopje: 1
  108.  */
  109.  
  110. abstract class Contact {
  111.     // Protected
  112.     protected String date; // format YYYY-MM-DD
  113.     // Public
  114.     public Contact(String date) {
  115.         this.date = date;
  116.     }
  117.     public boolean isNewerThan(Contact c) {
  118.         SimpleDateFormat obj = new SimpleDateFormat("yyyy-MM-dd");
  119.         Date thisDate = null;
  120.         Date thatDate = null;
  121.         try {
  122.             thisDate = obj.parse(this.date);
  123.             thatDate = obj.parse(c.date);
  124.         } catch (ParseException e) {
  125.             System.out.println("problem");
  126.         }
  127.         return thisDate.compareTo(thatDate) > 0;
  128.     }
  129.     abstract public String getType();
  130. }
  131.  
  132.  
  133. class EmailContact extends Contact {
  134.     private String email;
  135.  
  136.     public EmailContact(String date, String email) {
  137.         super(date);
  138.         this.email = email;
  139.     }
  140.  
  141.     public String getEmail() {
  142.         return email;
  143.     }
  144.  
  145.     @Override
  146.     public String getType() {
  147.         return "Email";
  148.     }
  149.  
  150. }
  151.  
  152. enum Operator {
  153.     TMOBILE, VIP, ONE
  154. }
  155.  
  156. class PhoneContact extends Contact {
  157.     private String phone;
  158.  
  159.     public PhoneContact(String date, String phone) {
  160.         super(date);
  161.         this.phone = phone;
  162.     }
  163.  
  164.     public String getPhone() {
  165.         return phone;
  166.     }
  167.  
  168.     public Operator getOperator() {
  169.         char prefix = phone.charAt(2);
  170.         if (prefix == '0' || prefix == '1' || prefix == '2') {
  171.             return Operator.TMOBILE;
  172.         } else if (prefix == '5' || prefix == '6') {
  173.             return Operator.ONE;
  174.         } else {
  175.             return Operator.VIP;
  176.         }
  177.     }
  178.  
  179.     public String getType() {
  180.         return "Phone";
  181.     }
  182.  
  183. }
  184.  
  185. class Student {
  186.     // Private
  187.     private String firstName;
  188.     private String lastName;
  189.     private String city;
  190.     private int age;
  191.     private long index;
  192.     private Contact[] contacts;
  193.  
  194.     // Public
  195.     public Student(String firstName, String lastName, String city, int age, long index) {
  196.         this.firstName = firstName;
  197.         this.lastName = lastName;
  198.         this.city = city;
  199.         this.age = age;
  200.         this.index = index;
  201.         contacts = new Contact[0];
  202.     }
  203.  
  204.     private void increaseContacts() {
  205.         Contact temp[] = new Contact[contacts.length];
  206.         System.arraycopy(contacts, 0, temp, 0, contacts.length);
  207.         /* better to just temp = contacts so you don't make a useless copy */
  208.         contacts = new Contact[temp.length + 1];
  209.         System.arraycopy(temp, 0, contacts, 0, temp.length);
  210.     }
  211.  
  212.     public void addEmailContact(String date, String email) {
  213.         increaseContacts();
  214.         contacts[contacts.length - 1] = new EmailContact(date, email);
  215.     }
  216.  
  217.     public void addPhoneContact(String date, String phone) {
  218.         increaseContacts();
  219.         contacts[contacts.length - 1] = new PhoneContact(date, phone);
  220.     }
  221.  
  222.     public Contact[] getEmailContacts() {
  223.         Contact temp[] = new Contact[(int) Arrays.stream(contacts).filter(i -> i.getType().equals("Email")).count()];
  224.         Object objects[] = IntStream.range(0, contacts.length)
  225.                 .filter(i -> contacts[i].getType().equals("Email"))
  226.                 .mapToObj(i -> contacts[i])
  227.                 .toArray();
  228.         System.arraycopy(objects, 0, temp, 0, objects.length);
  229.         return temp;
  230.     }
  231.  
  232.     public Contact[] getPhoneContacts() {
  233.         Contact temp[] = new Contact[(int) Arrays.stream(contacts).filter(i -> i.getType().equals("Phone")).count()];
  234.         Object objects[] = IntStream.range(0, contacts.length)
  235.                 .filter(i -> contacts[i].getType().equals("Phone"))
  236.                 .mapToObj(i -> contacts[i])
  237.                 .toArray();
  238.         System.arraycopy(objects, 0, temp, 0, objects.length);
  239.         return temp;
  240.     }
  241.  
  242.     public String getCity() {
  243.         return city;
  244.     }
  245.  
  246.     public String getFullName() {
  247.         return firstName + " " + lastName;
  248.     }
  249.  
  250.     public long getIndex() {
  251.         return index;
  252.     }
  253.  
  254.     public Contact getLatestContact() {
  255.         final Contact[] r = {contacts[0]};
  256.         Arrays.stream(contacts).filter(i -> i.isNewerThan(r[0])).forEach(i -> r[0] = i);
  257.         return r[0];
  258.     }
  259.  
  260.     @Override
  261.     public String toString() {
  262.         String result = String.format("{\"ime\":\"%s\", \"prezime\":\"%s\", \"vozrast\":%d, \"grad\":\"%s\", \"indeks\":%d, \"telefonskiKontakti\":[", firstName, lastName, age, city, index);
  263.         result += (getPhoneContacts().length != 0 ? "\"" +
  264.                 Arrays.stream(getPhoneContacts()).map(i -> ((PhoneContact) i).getPhone())
  265.                         .collect(Collectors.joining("\", \"")) + "\"" : "") + "], \"emailKontakti\":[";
  266.         result += (getEmailContacts().length != 0 ? "\"" + Arrays.stream(getEmailContacts()).map(i -> ((EmailContact) i).getEmail()).collect(Collectors.joining("\", \"")) + "\"" : "") + "]}";
  267.         return result;
  268.     }
  269.  
  270.     public int totalContacts() {
  271.         return getEmailContacts().length + getPhoneContacts().length;
  272.     }
  273. }
  274.  
  275. class Faculty {
  276.     // Private
  277.     private String name;
  278.     private Student[] students;
  279.  
  280.     private int contactLen(Student s) {
  281.         return s.getEmailContacts().length + s.getPhoneContacts().length;
  282.     }
  283.  
  284.     public Faculty(String name, Student[] students) {
  285.         this.name = name;
  286.         this.students = new Student[students.length];
  287.         System.arraycopy(students, 0, this.students, 0, students.length);
  288.     }
  289.  
  290.     public int countStudentsFromCity(String cityName) {
  291.         return (int) Arrays.stream(students)
  292.                 .filter(student -> student.getCity().equals(cityName))
  293.                 .count();
  294.     }
  295.  
  296.     public Student getStudent(long index) {
  297.         return Arrays.stream(students)
  298.                 .filter(student -> student.getIndex() == index)
  299.                 .findFirst()
  300.                 .get();
  301.     }
  302.  
  303.     public double getAverageNumberOfContacts() {
  304.         return Arrays.stream(students)
  305.                 .mapToDouble(student -> student.totalContacts())
  306.                 .average()
  307.                 .getAsDouble();
  308.     }
  309.  
  310.     public Student getStudentWithMostContacts() {
  311.         int max = Arrays.stream(students)
  312.                 .mapToInt(student -> student.totalContacts())
  313.                 .max()
  314.                 .getAsInt();
  315.         return Arrays.stream(students).filter(student -> student.totalContacts() == max).findFirst().get();
  316.     }
  317.  
  318.     @Override
  319.     public String toString() {
  320.         String result = String.format("{\"fakultet\":\"%s\", \"studenti\":[", name);
  321.         result += Arrays.stream(students).
  322.                 map(Student::toString)
  323.                 .collect(Collectors.joining(", ")) + "]}";
  324.         return result;
  325.     }
  326. }
  327.  
  328. public class ContactsTester {
  329.     public static void main(String[] args) {
  330.         Scanner scanner = new Scanner(System.in);
  331.  
  332.         int tests = scanner.nextInt();
  333.         Faculty faculty = null;
  334.  
  335.         int rvalue = 0;
  336.         long rindex = -1;
  337.  
  338.         DecimalFormat df = new DecimalFormat("0.00");
  339.  
  340.         for (int t = 0; t < tests; t++) {
  341.  
  342.             rvalue++;
  343.             String operation = scanner.next();
  344.  
  345.             switch (operation) {
  346.                 case "CREATE_FACULTY": {
  347.                     String name = scanner.nextLine().trim();
  348.                     int N = scanner.nextInt();
  349.  
  350.                     Student[] students = new Student[N];
  351.  
  352.                     for (int i = 0; i < N; i++) {
  353.                         rvalue++;
  354.  
  355.                         String firstName = scanner.next();
  356.                         String lastName = scanner.next();
  357.                         String city = scanner.next();
  358.                         int age = scanner.nextInt();
  359.                         long index = scanner.nextLong();
  360.  
  361.                         if ((rindex == -1) || (rvalue % 13 == 0))
  362.                             rindex = index;
  363.  
  364.                         Student student = new Student(firstName, lastName, city,
  365.                                 age, index);
  366.                         students[i] = student;
  367.                     }
  368.  
  369.                     faculty = new Faculty(name, students);
  370.                     break;
  371.                 }
  372.  
  373.                 case "ADD_EMAIL_CONTACT": {
  374.                     long index = scanner.nextInt();
  375.                     String date = scanner.next();
  376.                     String email = scanner.next();
  377.  
  378.                     rvalue++;
  379.  
  380.                     if ((rindex == -1) || (rvalue % 3 == 0))
  381.                         rindex = index;
  382.  
  383.                     faculty.getStudent(index).addEmailContact(date, email);
  384.  
  385.                     break;
  386.                 }
  387.  
  388.                 case "ADD_PHONE_CONTACT": {
  389.                     long index = scanner.nextInt();
  390.                     String date = scanner.next();
  391.                     String phone = scanner.next();
  392.  
  393.                     rvalue++;
  394.  
  395.                     if ((rindex == -1) || (rvalue % 3 == 0))
  396.                         rindex = index;
  397.  
  398.                     faculty.getStudent(index).addPhoneContact(date, phone);
  399.  
  400.                     break;
  401.                 }
  402.  
  403.                 case "CHECK_SIMPLE": {
  404.                     System.out.println("Average number of contacts: "
  405.                             + df.format(faculty.getAverageNumberOfContacts()));
  406.  
  407.                     rvalue++;
  408.  
  409.                     String city = faculty.getStudent(rindex).getCity();
  410.                     System.out.println("Number of students from " + city + ": "
  411.                             + faculty.countStudentsFromCity(city));
  412.  
  413.                     break;
  414.                 }
  415.  
  416.                 case "CHECK_DATES": {
  417.  
  418.                     rvalue++;
  419.  
  420.                     System.out.print("Latest contact: ");
  421.                     Contact latestContact = faculty.getStudent(rindex)
  422.                             .getLatestContact();
  423.                     if (latestContact.getType().equals("Email"))
  424.                         System.out.println(((EmailContact) latestContact)
  425.                                 .getEmail());
  426.                     if (latestContact.getType().equals("Phone"))
  427.                         System.out.println(((PhoneContact) latestContact)
  428.                                 .getPhone()
  429.                                 + " ("
  430.                                 + ((PhoneContact) latestContact).getOperator()
  431.                                 .toString() + ")");
  432.  
  433.                     if (faculty.getStudent(rindex).getEmailContacts().length > 0
  434.                             && faculty.getStudent(rindex).getPhoneContacts().length > 0) {
  435.                         System.out.print("Number of email and phone contacts: ");
  436.                         System.out
  437.                                 .println(faculty.getStudent(rindex)
  438.                                         .getEmailContacts().length
  439.                                         + " "
  440.                                         + faculty.getStudent(rindex)
  441.                                         .getPhoneContacts().length);
  442.  
  443.                         System.out.print("Comparing dates: ");
  444.                         int posEmail = rvalue
  445.                                 % faculty.getStudent(rindex).getEmailContacts().length;
  446.                         int posPhone = rvalue
  447.                                 % faculty.getStudent(rindex).getPhoneContacts().length;
  448.  
  449.                         System.out.println(faculty.getStudent(rindex)
  450.                                 .getEmailContacts()[posEmail].isNewerThan(faculty
  451.                                 .getStudent(rindex).getPhoneContacts()[posPhone]));
  452.                     }
  453.  
  454.                     break;
  455.                 }
  456.  
  457.                 case "PRINT_FACULTY_METHODS": {
  458.                     System.out.println("Faculty: " + faculty.toString());
  459.                     System.out.println("Student with most contacts: "
  460.                             + faculty.getStudentWithMostContacts().toString());
  461.                     break;
  462.                 }
  463.  
  464.             }
  465.  
  466.         }
  467.  
  468.         scanner.close();
  469.     }
  470. }
Advertisement
Add Comment
Please, Sign In to add comment