Advertisement
Filip_Markoski

[NP] 2.2 Контакти (Solved)

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