Advertisement
SashkoKlincharov

[Java][НП] - Телефонски именик

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