kristina7

НП - Лаб 3-2 Телефонски именик

Nov 19th, 2018
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.63 KB | None | 0 0
  1. /*
  2. Во оваа задача треба да имплементирате класа која ќе претставува телефонски именик. Именикот се состои од повеќе контакти при што, за секој контакт се чуваат неговото име и максимум до 5 телефонски броја за тој контакт. За потребите на класата Contact треба да ги имплементирате следниве методи.
  3.  
  4. Contact(String name, String... phonenumber) - конструктор со параметри - името треба да е подолго од 4 караткери, но максимум до 10 карактери и не смее да содржи други знаци освен латинични букви и бројки во спротивно се фрла исклучок од тип InvalidNameException - телефонските броеви мора да се состојат од точно 9 цифри при што првите три цифри се "070", "071", "072", "075","076","077" или "078" во спротивно се фрла исклучок од тип InvalidNumberException - контактот може да содржи максимум 5 броја во спротивно се фрла исклучок MaximumSizeExceddedException
  5. getName():String - get метод за името
  6. getNumbers():String[] - get метод за броевите кои треба да се лексикографски подредени (нека враќа копија од оригиналната низа)
  7. addNumber(String phonenumber) - метод кој додава нов број во контактот - за овој метод важат истите ограничувања за форматот на броевите како и во конструкторот
  8. toString():String - враќа текстуален опис во следниот формат Во прв ред името на контактот, во втор ред бројот на телефонски броеви и понатаму во одделни редови секој број поединечно повторно сортирани лексикографски
  9. valueOf(String s):Contact - статички метод кој за дадена тексутална репрезентација на контактот ќе врати соодветен објект - доколку настане било каков проблем при претварањето од тексутална репрезентација во објект Contact треба да се фрли исклучок од тип InvalidFormatException
  10. Користејќи ја класата Contact која ја напишавте сега треба да се развие и класа за телефонски именик PhoneBook. Оваа класа содржи низа од не повеќе од 250 контакти и ги нуди следниве методи
  11.  
  12. PhoneBook() - празен конструктор
  13. addContact(Contact contact):void - додава нов контакт во именикот, притоа доколку се надмине максималниот капацитет од 250 се фрла исклучок MaximumSizeExceddedException - дополнително ограничување е што сите имиња на контакти мора да бидат единствени, доколку контактот што сакате да го додадете има исто име со некој од веќе постоечките контакти треба да фрлите исклучок од типот InvalidNameException
  14. getContactForName(String name):Contact - го враќа контактот со соодветното име доколку таков постои во спротивно враќа null
  15. numberOfContacts():int - го враќа бројот на контакти во именикот
  16. getContacts():Contact[] - враќа низа од сите контакти сортирани според нивното име (нека враќа копија од низата)
  17. removeContact(String name):boolean - го брише соодветниот контакт од именикот и раќа true доколку постои, во спротивно враќа false
  18. toString():String - враќа текстуален опис на именикот каде се наредени сите контакти подредени според нивното име, одделени со по еден празен ред
  19. saveAsTextFile(PhoneBook phonebook,String path):boolean - статички метод кој го запишува именикот во текстуална датотека која се наоѓа на локација path,доколку не постои датотеката треба да се креира- методот враќа false само доколку има некаков проблем при запишување на податоците во датотеката
  20. loadFromTextFile(String path):Phonebook - статички метод кој вчитува именик претходно запишан со методот saveAsTextFile - доколку датотеката не постои или неможе да се отвори за читање се пропагира оригиналниот IOException, а доколку настане проблем при парсирањето на текстот од датотеката треба да се фрли исклучок InvalidFormatException
  21. getContactsForNumber(String number_prefix):Contact[] - за даден префикс од број (првите неколку цифри) ги враќа сите контакти кои имаат барем еден број со тој префикс - низата не треба да содржи дупликат контакти или null елементи подредена според имињата на контактите
  22. *Сите исклучоци освен IOException треба сами да ги напишете - секаде каде што е можно додате дополнително објаснување или податочни членови во врска со причината за исклучокот
  23. */
  24.  
  25. import java.io.*;
  26. import java.util.*;
  27.  
  28. class PhoneBook {
  29.     private List<Contact> contacts;
  30.    
  31.     public PhoneBook() {
  32.         contacts = new ArrayList<>();
  33.     }
  34.     public void addContact(Contact c) throws MaximumSizeExceddedException, InvalidNameException {
  35.         if(contacts.size() > 250)
  36.             throw new MaximumSizeExceddedException();
  37.         for (Contact contact : contacts) {
  38.             if(contact.getName().equals(c.getName()))
  39.                 throw new InvalidNameException(c.getName());
  40.         }
  41.         contacts.add(c);
  42.     }
  43.     public Contact getContactForName(String name) {
  44.         for (Contact contact : contacts) {
  45.             if(contact.getName().equals(name))
  46.                 return contact;
  47.         }
  48.         return null;
  49.     }
  50.    
  51.     public int numberOfContacts() {
  52.         return contacts.size();
  53.     }
  54.     public Contact[] getContacts() {
  55.         Contact[] copy = new Contact[contacts.size()];
  56.         int i=0;
  57.         for (Contact contact : contacts) {
  58.             copy[i++] = contact;
  59.         }
  60.         Arrays.sort(copy, (c1, c2) -> c1.getName().compareTo(c2.getName()));
  61.         return copy;
  62.     }
  63.     public boolean removeContact(String name) {
  64.         Contact c = getContactForName(name);
  65.         return contacts.remove(c);
  66.     }
  67.     @Override
  68.     public String toString() {
  69.         String s="";
  70.         for (Contact contact : getContacts()) {
  71.             s+=contact + "\n";
  72.         }
  73.         return s;
  74.     }
  75.    
  76.     public static boolean saveAsTextFile(PhoneBook phonebook,String path) {
  77.         File file = new File(path);
  78.         PrintWriter pw;
  79.         try {
  80.             file.createNewFile();
  81.             pw = new PrintWriter(file);
  82.             pw.print(phonebook.toString());
  83.             pw.flush();
  84.         } catch (IOException e) {
  85.             return false;
  86.         }
  87.         return true;
  88.        
  89.     }
  90.     public static PhoneBook loadFromTextFile(String path){
  91.         File file = new File(path);
  92.         PhoneBook result = new PhoneBook();
  93.         try {
  94.             BufferedReader br = new BufferedReader(new FileReader(file));
  95.             String line;
  96.             while ((line = br.readLine()) != null ) {
  97.                 line +="\n";
  98.                 line += br.readLine();
  99.                 Contact c = Contact.valueOf(line);
  100.                 result.addContact(c);              
  101.             }
  102.         }catch (InvalidFormatException e) {
  103.            
  104.         }
  105.         catch(IOException e) {
  106.            
  107.         }
  108.         return result;
  109.     }
  110.     public Contact[] getContactsForNumber(String number_prefix) {
  111.         Contact[] result = new Contact[contacts.size()];
  112.         int i=0;
  113.         for (Contact contact : contacts) {
  114.             for(String num : contact.getNumbers())
  115.                 if(num.startsWith(number_prefix)) {
  116.                     result[i++] = contact;
  117.                     break;
  118.                 }
  119.         }
  120.         result = Arrays.copyOf(result, i);
  121.         return result;
  122.     }
  123.    
  124.    
  125. }
  126.  
  127. class Contact {
  128.     private String name;
  129.     private String[] numbers;
  130.    
  131.     public Contact(String name, String... phonenumber) throws InvalidNameException,
  132.     MaximumSizeExceddedException, InvalidNumberException {
  133.         if(!validName(name))
  134.             throw new InvalidNameException(name);
  135.         if(phonenumber.length > 5)
  136.             throw new MaximumSizeExceddedException();
  137.         this.name = name;
  138.         numbers = new String[phonenumber.length];
  139.         int i=0;
  140.         for (String num : phonenumber) {
  141.             if(!validNumber(num))
  142.                 throw new InvalidNumberException(num);
  143.             numbers[i++] = num;
  144.         }
  145.     }
  146.     public String getName() {
  147.         return this.name;
  148.     }
  149.     public String[] getNumbers() {
  150.         String[] copy = Arrays.copyOf(numbers, numbers.length);
  151.         Arrays.sort(copy);
  152.        
  153.         return copy;
  154.     }
  155.     public void addNumber(String number) throws InvalidNumberException, MaximumSizeExceddedException {
  156.         if(!validNumber(number))
  157.             throw new InvalidNumberException(number);
  158.         int dolzina = numbers.length;
  159.         if(dolzina == 5)
  160.             throw new MaximumSizeExceddedException();
  161.         numbers = Arrays.copyOf(numbers, dolzina+1);
  162.         numbers[dolzina] = number;
  163.     }
  164.    
  165.     public boolean validName(String name)
  166.     {
  167.         if(name.length() < 4 ||  name.length() > 10)
  168.             return false;
  169.         for (char bukva : name.toCharArray()) {
  170.             if(!Character.isLetterOrDigit(bukva))
  171.                 return false;
  172.         }
  173.         return true;
  174.     }
  175.    
  176.     public boolean validNumber(String num) {
  177.         if(num.length() != 9)
  178.             return false;
  179.         if(num.charAt(0) != '0' || num.charAt(1) != '7' || num.charAt(2) == '3' ||
  180.                 num.charAt(2) == '4' || num.charAt(2) == '9')
  181.             return false;
  182.         for(char cifra: num.toCharArray()) {
  183.             if(!Character.isDigit(cifra))
  184.                 return false;
  185.         }
  186.        
  187.         return true;
  188.     }
  189.  
  190.     public static Contact valueOf(String s) {
  191.         String[] parts = s.split("\n");
  192.         String[] nums = parts[1].substring(1, parts[1].length()-1).split(", ");
  193.         try {
  194.             Contact c = new Contact(parts[0], nums);
  195.             return c;
  196.         } catch (InvalidFormatException e) {
  197.             return null;
  198.         }
  199.     }
  200.    
  201.     @Override
  202.     public String toString() {
  203.         StringBuilder sb = new StringBuilder();
  204.         sb.append(this.name + "\n");
  205.         sb.append(this.numbers.length + "\n");
  206.         for (String n : getNumbers()) {
  207.             sb.append(n + "\n");
  208.         }
  209.         return sb.toString();
  210.     }
  211. }
  212. public class PhonebookTester {
  213.  
  214.     public static void main(String[] args) throws Exception {
  215.         Scanner jin = new Scanner(System.in);
  216.         String line = jin.nextLine();
  217.         switch( line ) {
  218.             case "test_contact":
  219.                 testContact(jin);
  220.                 break;
  221.             case "test_phonebook_exceptions":
  222.                 testPhonebookExceptions(jin);
  223.                 break;
  224.             case "test_usage":
  225.                 testUsage(jin);
  226.                 break;
  227.         }
  228.     }
  229.  
  230.     private static void testFile(Scanner jin) throws Exception {
  231.         PhoneBook phonebook = new PhoneBook();
  232.         while ( jin.hasNextLine() )
  233.             phonebook.addContact(new Contact(jin.nextLine(),jin.nextLine().split("\\s++")));
  234.         String text_file = "phonebook.txt";
  235.         PhoneBook.saveAsTextFile(phonebook,text_file);
  236.         PhoneBook pb = PhoneBook.loadFromTextFile(text_file);
  237.         if ( ! pb.equals(phonebook) ) System.out.println("Your file saving and loading doesn't seem to work right");
  238.         else System.out.println("Your file saving and loading works great. Good job!");
  239.     }
  240.  
  241.     private static void testUsage(Scanner jin) throws Exception {
  242.         PhoneBook phonebook = new PhoneBook();
  243.         while ( jin.hasNextLine() ) {
  244.             String command = jin.nextLine();
  245.             switch ( command ) {
  246.                 case "add":
  247.                     phonebook.addContact(new Contact(jin.nextLine(),jin.nextLine().split("\\s++")));
  248.                     break;
  249.                 case "remove":
  250.                     phonebook.removeContact(jin.nextLine());
  251.                     break;
  252.                 case "print":
  253.                     System.out.println(phonebook.numberOfContacts());
  254.                     System.out.println(Arrays.toString(phonebook.getContacts()));
  255.                     System.out.println(phonebook.toString());
  256.                     break;
  257.                 case "get_name":
  258.                     System.out.println(phonebook.getContactForName(jin.nextLine()));
  259.                     break;
  260.                 case "get_number":
  261.                     System.out.println(Arrays.toString(phonebook.getContactsForNumber(jin.nextLine())));
  262.                     break;
  263.             }          
  264.         }
  265.     }
  266.  
  267.     private static void testPhonebookExceptions(Scanner jin) {
  268.         PhoneBook phonebook = new PhoneBook();
  269.         boolean exception_thrown = false;
  270.         try {
  271.             while ( jin.hasNextLine() ) {
  272.                 phonebook.addContact(new Contact(jin.nextLine()));
  273.             }
  274.         }
  275.         catch ( InvalidNameException e ) {
  276.             System.out.println(e.name);
  277.             exception_thrown = true;
  278.         }
  279.         catch ( Exception e ) {}
  280.         if ( ! exception_thrown ) System.out.println("Your addContact method doesn't throw InvalidNameException");
  281.         /*
  282.         exception_thrown = false;
  283.         try {
  284.         phonebook.addContact(new Contact(jin.nextLine()));
  285.         } catch ( MaximumSizeExceddedException e ) {
  286.             exception_thrown = true;
  287.         }
  288.         catch ( Exception e ) {}
  289.         if ( ! exception_thrown ) System.out.println("Your addContact method doesn't throw MaximumSizeExcededException");
  290.         */
  291.     }
  292.  
  293.     private static void testContact(Scanner jin) throws Exception {    
  294.         boolean exception_thrown = true;
  295.         String names_to_test[] = { "And\nrej","asd","AAAAAAAAAAAAAAAAAAAAAA","Ð�ндрејA123213","Andrej#","Andrej<3"};
  296.         for ( String name : names_to_test ) {
  297.             try {
  298.                 new Contact(name);
  299.                 exception_thrown = false;
  300.             } catch (InvalidNameException e) {
  301.                 exception_thrown = true;
  302.             }
  303.             if ( ! exception_thrown ) System.out.println("Your Contact constructor doesn't throw an InvalidNameException");
  304.         }
  305.         String numbers_to_test[] = { "+071718028","number","078asdasdasd","070asdqwe","070a56798","07045678a","123456789","074456798","073456798","079456798" };
  306.         for ( String number : numbers_to_test ) {
  307.             try {
  308.                 new Contact("Andrej",number);
  309.                 exception_thrown = false;
  310.             } catch (InvalidNumberException e) {
  311.                 exception_thrown = true;
  312.             }
  313.             if ( ! exception_thrown ) System.out.println("Your Contact constructor doesn't throw an InvalidNumberException");
  314.         }
  315.         String nums[] = new String[10];
  316.         for ( int i = 0 ; i < nums.length ; ++i ) nums[i] = getRandomLegitNumber();
  317.         try {
  318.             new Contact("Andrej",nums);
  319.             exception_thrown = false;
  320.         } catch (MaximumSizeExceddedException e) {
  321.             exception_thrown = true;
  322.         }
  323.         if ( ! exception_thrown ) System.out.println("Your Contact constructor doesn't throw a MaximumSizeExceddedException");
  324.         Random rnd = new Random(5);
  325.         Contact contact = new Contact("Andrej",getRandomLegitNumber(rnd),getRandomLegitNumber(rnd),getRandomLegitNumber(rnd));
  326.         System.out.println(contact.getName());
  327.         System.out.println(Arrays.toString(contact.getNumbers()));
  328.         System.out.println(contact.toString());
  329.         contact.addNumber(getRandomLegitNumber(rnd));
  330.         System.out.println(Arrays.toString(contact.getNumbers()));
  331.         System.out.println(contact.toString());
  332.         contact.addNumber(getRandomLegitNumber(rnd));
  333.         System.out.println(Arrays.toString(contact.getNumbers()));
  334.         System.out.println(contact.toString());
  335.     }
  336.  
  337.     static String[] legit_prefixes = {"070","071","072","075","076","077","078"};
  338.     static Random rnd = new Random();
  339.    
  340.     private static String getRandomLegitNumber() {
  341.         return getRandomLegitNumber(rnd);
  342.     }
  343.    
  344.     private static String getRandomLegitNumber(Random rnd) {
  345.         StringBuilder sb = new StringBuilder(legit_prefixes[rnd.nextInt(legit_prefixes.length)]);
  346.         for ( int i = 3 ; i < 9 ; ++i )
  347.             sb.append(rnd.nextInt(10));
  348.         return sb.toString();
  349.     }
  350.    
  351.  
  352. }
  353. class InvalidNameException extends InvalidFormatException{
  354.     String name;
  355.     public InvalidNameException(String name) {     
  356.         super(name);
  357.         this.name = name;
  358.     }
  359. }
  360. class InvalidNumberException extends InvalidFormatException{
  361.     public InvalidNumberException(String number) {
  362.         super(number);
  363.     }
  364. }
  365. class MaximumSizeExceddedException extends InvalidFormatException{
  366.     public MaximumSizeExceddedException() {
  367.         super("Maximum size excedded");
  368.     }
  369. }
  370. class InvalidFormatException extends Exception{
  371.     public InvalidFormatException(String message) {
  372.         super(message);
  373.     }
  374. }
Add Comment
Please, Sign In to add comment