Advertisement
JovanPapi

[NP - lab2] Kontakti

Oct 27th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.37 KB | None | 0 0
  1. import java.text.DecimalFormat;
  2. import java.util.Arrays;
  3. import java.util.Scanner;
  4.  
  5. abstract class Contact {
  6.     private String date;
  7.     private int year;
  8.     private int month;
  9.     private int day;
  10.  
  11.     public Contact(String date) {
  12.         this.date = date;
  13.         this.year = Integer.parseInt(date.substring(0, 4));
  14.         this.month = Integer.parseInt(date.substring(5, 7));
  15.         this.day = Integer.parseInt(date.substring(8, 10));
  16.     }
  17.  
  18.     public boolean isNewerThan(Contact other) {
  19.         if (this.year > other.year) return true;
  20.         if (this.year < other.year) return false;
  21.  
  22.         if (this.month > other.month) return true;
  23.         if (this.month < other.month) return false;
  24.  
  25.         if (this.day > other.day) return true;
  26.         return false;
  27.     }
  28.  
  29.     public abstract String getType();
  30.     public abstract String getEmail();
  31.     public abstract String getPhone();
  32. }
  33.  
  34. class EmailContact extends Contact {
  35.     private String email;
  36.  
  37.     public EmailContact(String date, String email) {
  38.         super(date);
  39.         this.email = email;
  40.     }
  41.  
  42.     public String getEmail() {
  43.         return email;
  44.     }
  45.  
  46.     @Override
  47.     public String getPhone() {
  48.         return null;
  49.     }
  50.  
  51.     @Override
  52.     public String getType() {
  53.         return "Email";
  54.     }
  55. }
  56.  
  57. class PhoneContact extends Contact {
  58.     private String phone;
  59.  
  60.     @Override
  61.     public String getType() {
  62.         return "Phone";
  63.     }
  64.  
  65.     @Override
  66.     public String getEmail() {
  67.         return null;
  68.     }
  69.  
  70.     private enum Operator {
  71.         VIP,
  72.         TMOBILE,
  73.         ONE
  74.     }
  75.  
  76.     public PhoneContact(String date, String phone) {
  77.         super(date);
  78.         this.phone = phone;
  79.     }
  80.  
  81.     public String getPhone() {
  82.         return phone;
  83.     }
  84.  
  85.     public Operator getOperator() {
  86.         if (phone.charAt(2) == '0' || phone.charAt(2) == '1' || phone.charAt(2) == '2') return Operator.TMOBILE;
  87.         if (phone.charAt(2) == '5' || phone.charAt(2) == '6') return Operator.ONE;
  88.         return Operator.VIP;
  89.     }
  90. }
  91.  
  92. class Student {
  93.     Contact[] contacts;
  94.     private String firstName;
  95.     private String lastName;
  96.     private String city;
  97.     private int age;
  98.     private long index;
  99.  
  100.     private int contactsCounter;
  101.     private int phoneCounter;
  102.     private int emailCounter;
  103.  
  104.     public Student(String firstName, String lastName, String city, int age, long index) {
  105.         this.firstName = firstName;
  106.         this.lastName = lastName;
  107.         this.city = city;
  108.         this.age = age;
  109.         this.index = index;
  110.         contactsCounter = 0;
  111.         phoneCounter = 0;
  112.         emailCounter = 0;
  113.     }
  114.  
  115.     public void addEmailContact(String date, String email) {
  116.         Contact[] auxArr = new Contact[contactsCounter + 1];
  117.         for (int i = 0; i < contactsCounter; i++) {
  118.             if (contacts == null) break;
  119.             auxArr[i] = contacts[i];
  120.  
  121.         }
  122.         auxArr[contactsCounter++] = new EmailContact(date, email);
  123.         contacts = auxArr;
  124.         emailCounter++;
  125.     }
  126.  
  127.     public void addPhoneContact(String date, String phone) {
  128.         Contact[] auxArr = new Contact[contactsCounter + 1];
  129.         for (int i = 0; i < contactsCounter; i++) {
  130.             if (contacts == null) break;
  131.             auxArr[i] = contacts[i];
  132.  
  133.         }
  134.         auxArr[contactsCounter++] = new PhoneContact(date, phone);
  135.         contacts = auxArr;
  136.         phoneCounter++;
  137.     }
  138.  
  139.     public Contact[] getEmailContacts() {
  140.         Contact[] emails = new Contact[emailCounter];
  141.         int auxCounter = 0;
  142.  
  143.         for (Contact email : contacts) {
  144.             if (email.getType().equals("Email")) {
  145.                 emails[auxCounter++] = email;
  146.             }
  147.         }
  148.         return emails;
  149.     }
  150.  
  151.     public Contact[] getPhoneContacts() {
  152.         Contact[] phones = new Contact[phoneCounter];
  153.         int auxCounter = 0;
  154.  
  155.         for (Contact phone: contacts) {
  156.             if (phone.getType().equals("Phone"))
  157.                 phones[auxCounter++] = phone;
  158.         }
  159.         return phones;
  160.     }
  161.  
  162.     public String getCity() {
  163.         return city;
  164.     }
  165.  
  166.     public String getFullName() {
  167.         return firstName.toUpperCase() + " " + lastName.toUpperCase();
  168.     }
  169.  
  170.     public long getIndex() {
  171.         return index;
  172.     }
  173.  
  174.     public Contact getLatestContact() {
  175.  
  176.         int newestContact = 0;
  177.         for (int i = 0; i < contacts.length; i++) {
  178.             if(contacts[i].isNewerThan(contacts[newestContact])){
  179.                 newestContact = i;
  180.             }
  181.         }
  182.         return contacts[newestContact];
  183.     }
  184.  
  185.     @Override
  186.     public String toString() {
  187.         StringBuilder sb = new StringBuilder();
  188.  
  189.         sb.append("{\"ime\":\"").append(firstName).append("\", \"prezime\":\"").append(lastName).append("\", ");
  190.         sb.append("\"vozrast\":").append(age).append(", \"grad\":\"").append(city).append("\", ");
  191.         sb.append("\"indeks\":").append(index).append(", \"telefonskiKontakti\":[");
  192.  
  193.         Contact[] phones = getPhoneContacts();
  194.         for (int i = 0; i < phones.length; i++) {
  195.             if(i < phones.length-1){
  196.                 sb.append("\"").append(phones[i].getPhone()).append("\", ");
  197.             }
  198.             else{
  199.                 sb.append("\"").append(phones[i].getPhone()).append("\"");
  200.             }
  201.         }
  202.         sb.append("], ");
  203.         sb.append("\"emailKontakti\":[");
  204.         Contact[] emails = getEmailContacts();
  205.         for (int i = 0; i < emails.length; i++) {
  206.             if(i < emails.length-1){
  207.                 sb.append("\"").append(emails[i].getEmail()).append("\", ");
  208.             }
  209.             else{
  210.                 sb.append("\"").append(emails[i].getEmail()).append("\"");
  211.             }
  212.         }
  213.         sb.append("]}");
  214.         return sb.toString();
  215.     }
  216.  
  217.     public int getContactsNumber() {
  218.         return contactsCounter;
  219.     }
  220. }
  221.  
  222. class Faculty {
  223.     private String name;
  224.     Student[] students;
  225.  
  226.     public Faculty(String name, Student[] students) {
  227.         this.name = name;
  228.         this.students = students;
  229.     }
  230.  
  231.     public int countStudentsFromCity(String cityName) {
  232.         //TODO da se proba so java streams.
  233.         int fromCityCounter = 0;
  234.         for (int i = 0; i < students.length; i++) {
  235.             if (students[i].getCity().equals(cityName)) {
  236.                 fromCityCounter++;
  237.             }
  238.         }
  239.         return fromCityCounter;
  240.     }
  241.  
  242.     public Student getStudent(long index) {
  243.  
  244.         //TODO da se proba so java streams.
  245.         Student student = students[0];
  246.         for (int i = 0; i < students.length; i++) {
  247.             if (students[i].getIndex() == index) {
  248.                 student = students[i];
  249.                 break;
  250.             }
  251.         }
  252.         return student;
  253.     }
  254.  
  255.     public double getAverageNumberOfContacts() {
  256.         //TODO da se proveri dali raboti vaka.
  257.         return Arrays.stream(students)
  258.                 .mapToDouble(Student::getContactsNumber)
  259.                 .sum() / students.length;
  260.     }
  261.  
  262.     public Student getStudentWithMostContacts() {
  263.         // TODO da se proba so java streams.
  264.         int maxContacts = students[0].contacts.length;
  265.         int index = 0;
  266.  
  267.         for (int i = 1; i < students.length; i++) {
  268.             if (students[i].contacts.length > maxContacts) {
  269.                 maxContacts = students[i].contacts.length;
  270.                 index = i;
  271.             } else if (students[i].contacts.length == maxContacts) {
  272.                 if (students[i].getIndex() > students[index].getIndex()) {
  273.                     maxContacts = students[i].contacts.length;
  274.                     index = i;
  275.                 }
  276.             }
  277.         }
  278.         return students[index];
  279.     }
  280.  
  281.     @Override
  282.     public String toString() {
  283.         StringBuilder sb = new StringBuilder();
  284.  
  285.         sb.append("{\"fakultet\":\"").append(name).append("\", \"studenti\":[");
  286.         for (int i = 0; i < students.length - 1; i++) {
  287.             sb.append(students[i].toString()).append(", ");
  288.         }
  289.         sb.append(students[students.length - 1].toString()).append("]}");
  290.         return sb.toString();
  291.     }
  292. }
  293.  
  294.  
  295. public class ContactsTester {
  296.  
  297.     public static void main(String[] args) {
  298.         Scanner scanner = new Scanner(System.in);
  299.  
  300.         int tests = scanner.nextInt();
  301.         Faculty faculty = null;
  302.  
  303.         int rvalue = 0;
  304.         long rindex = -1;
  305.  
  306.         DecimalFormat df = new DecimalFormat("0.00");
  307.  
  308.         for (int t = 0; t < tests; t++) {
  309.  
  310.             rvalue++;
  311.             String operation = scanner.next();
  312.  
  313.             switch (operation) {
  314.                 case "CREATE_FACULTY": {
  315.                     String name = scanner.nextLine().trim();
  316.                     int N = scanner.nextInt();
  317.  
  318.                     Student[] students = new Student[N];
  319.  
  320.                     for (int i = 0; i < N; i++) {
  321.                         rvalue++;
  322.  
  323.                         String firstName = scanner.next();
  324.                         String lastName = scanner.next();
  325.                         String city = scanner.next();
  326.                         int age = scanner.nextInt();
  327.                         long index = scanner.nextLong();
  328.  
  329.                         if ((rindex == -1) || (rvalue % 13 == 0))
  330.                             rindex = index;
  331.  
  332.                         Student student = new Student(firstName, lastName, city,
  333.                                 age, index);
  334.                         students[i] = student;
  335.                     }
  336.  
  337.                     faculty = new Faculty(name, students);
  338.                     break;
  339.                 }
  340.  
  341.                 case "ADD_EMAIL_CONTACT": {
  342.                     long index = scanner.nextInt();
  343.                     String date = scanner.next();
  344.                     String email = scanner.next();
  345.  
  346.                     rvalue++;
  347.  
  348.                     if ((rindex == -1) || (rvalue % 3 == 0))
  349.                         rindex = index;
  350.  
  351.                     faculty.getStudent(index).addEmailContact(date, email);
  352.                     break;
  353.                 }
  354.  
  355.                 case "ADD_PHONE_CONTACT": {
  356.                     long index = scanner.nextInt();
  357.                     String date = scanner.next();
  358.                     String phone = scanner.next();
  359.  
  360.                     rvalue++;
  361.  
  362.                     if ((rindex == -1) || (rvalue % 3 == 0))
  363.                         rindex = index;
  364.  
  365.                     faculty.getStudent(index).addPhoneContact(date, phone);
  366.                     break;
  367.                 }
  368.  
  369.                 case "CHECK_SIMPLE": {
  370.                     System.out.println("Average number of contacts: "
  371.                             + df.format(faculty.getAverageNumberOfContacts()));
  372.  
  373.                     rvalue++;
  374.  
  375.                     String city = faculty.getStudent(rindex).getCity();
  376.                     System.out.println("Number of students from " + city + ": "
  377.                             + faculty.countStudentsFromCity(city));
  378.  
  379.                     break;
  380.                 }
  381.  
  382.                 case "CHECK_DATES": {
  383.  
  384.                     rvalue++;
  385.  
  386.                     System.out.print("Latest contact: ");
  387.                     Contact latestContact = faculty.getStudent(rindex)
  388.                             .getLatestContact();
  389.                     if (latestContact.getType().equals("Email"))
  390.                         System.out.println(((EmailContact) latestContact)
  391.                                 .getEmail());
  392.                     if (latestContact.getType().equals("Phone"))
  393.                         System.out.println(((PhoneContact) latestContact)
  394.                                 .getPhone()
  395.                                 + " ("
  396.                                 + ((PhoneContact) latestContact).getOperator()
  397.                                 + ")");
  398.  
  399.                     if (faculty.getStudent(rindex).getEmailContacts().length > 0
  400.                             && faculty.getStudent(rindex).getPhoneContacts().length > 0) {
  401.                         System.out.print("Number of email and phone contacts: ");
  402.                         System.out
  403.                                 .println(faculty.getStudent(rindex)
  404.                                         .getEmailContacts().length
  405.                                         + " "
  406.                                         + faculty.getStudent(rindex)
  407.                                         .getPhoneContacts().length);
  408.  
  409.                         System.out.print("Comparing dates: ");
  410.                         int posEmail = rvalue
  411.                                 % faculty.getStudent(rindex).getEmailContacts().length;
  412.                         int posPhone = rvalue
  413.                                 % faculty.getStudent(rindex).getPhoneContacts().length;
  414.  
  415.                         System.out.println(faculty.getStudent(rindex)
  416.                                 .getEmailContacts()[posEmail].isNewerThan(faculty
  417.                                 .getStudent(rindex).getPhoneContacts()[posPhone]));
  418.                     }
  419.  
  420.                     break;
  421.                 }
  422.  
  423.                 case "PRINT_FACULTY_METHODS": {
  424.                     System.out.println("Faculty: " + faculty.toString());
  425.                     System.out.println("Student with most contacts: "
  426.                             + faculty.getStudentWithMostContacts().toString());
  427.                     break;
  428.                 }
  429.  
  430.             }
  431.  
  432.         }
  433.  
  434.         scanner.close();
  435.     }
  436. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement