Advertisement
SashkoKlincharov

[Java][НП] - Именик

Aug 27th, 2021
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.88 KB | None | 0 0
  1.  
  2.  
  3. Да се имплементира класа за именик PhoneBook со следните методи:
  4.  
  5. void addContact(String name, String number) - додава нов контакт во именикот. Ако се обидеме да додадеме контакт со веќе постоечки број, треба да се фрли исклучок од класа DuplicateNumberException со порака Duplicate number: [number]. Комплексноста на овој метод не треба да надминува O(logN) за N контакти.
  6. void contactsByNumber(String number) - ги печати сите контакти кои во бројот го содржат бројот пренесен како аргумент во методот (минимална должина на бројот [number] е 3). Комплексноста на овој метод не треба да надминува O(logN) за N контакти.
  7. void contactsByName(String name) - ги печати сите контакти кои даденото име. Комплексноста на овој метод треба да биде O(1).
  8.  
  9. Во двата методи контактите се печатат сортирани лексикографски според името, а оние со исто име потоа според бројот.
  10.  
  11.  
  12. import java.util.*;
  13.  
  14. class DuplicateNumberException extends Exception {
  15. public DuplicateNumberException(String message) {
  16. super(message);
  17. }
  18. }
  19.  
  20. class Contact implements Comparable<Contact> {
  21. private String name;
  22. private String number;
  23.  
  24. public Contact(String name, String number) {
  25. this.name = name;
  26. this.number = number;
  27. }
  28.  
  29. public String getName() {
  30. return name;
  31. }
  32.  
  33. public String getNumber() {
  34. return number;
  35. }
  36.  
  37. @Override
  38. public String toString() {
  39. return String.format("%s %s", name, number);
  40. }
  41.  
  42. @Override
  43. public boolean equals(Object o) {
  44. if (this == o) return true;
  45. if (o == null || getClass() != o.getClass()) return false;
  46. Contact contact = (Contact) o;
  47. return Objects.equals(name, contact.name)&&Objects.equals(number, contact.number);
  48. }
  49.  
  50. @Override
  51. public int hashCode() {
  52. return Objects.hash(name, number);
  53. }
  54.  
  55. @Override
  56. public int compareTo(Contact o) {
  57. int res = this.name.toLowerCase().compareTo(o.name.toLowerCase());
  58. if(res == 0)
  59. return this.number.compareTo(o.number);
  60. return res;
  61. }
  62. }
  63.  
  64. class PhoneBook {
  65. private Map<String, Contact> contactByNumber;
  66. private Map<String,Set<Contact>> contactsbyname;
  67.  
  68. public PhoneBook() {
  69. contactsbyname = new TreeMap<>();
  70. contactByNumber = new HashMap<>();
  71. }
  72.  
  73. public void addContact(String name, String number) throws DuplicateNumberException {
  74. if (contactByNumber.containsKey(number))
  75. throw new DuplicateNumberException(number);
  76.  
  77. Contact contact = new Contact(name, number);
  78. contactByNumber.put(number, contact);
  79. contactsbyname.putIfAbsent(name, new TreeSet<>());
  80. contactsbyname.computeIfPresent(name, (k, v) -> {
  81. v.add(contact);
  82.  
  83. return v;
  84. });
  85. }
  86. public void contactsByNumber(String number) {
  87. if (!noContactWithNumber(number)) {
  88. System.out.println("NOT FOUND");
  89. return;
  90. }
  91. contactByNumber
  92. .entrySet()
  93. .stream()
  94. .filter(each -> each.getKey().contains(number))
  95. .map(each -> each.getValue())
  96. .sorted(Contact::compareTo)
  97. .forEach(System.out::println);
  98. }
  99.  
  100. private boolean noContactWithNumber(String number) {
  101. return !contactByNumber
  102. .keySet()
  103. .stream()
  104. .filter(n -> n.contains(number))
  105. .findFirst().orElse("").equals("");
  106. }
  107.  
  108. public void contactsByName(String name) {
  109. if (!noContactWithName(name)) {
  110. System.out.println("NOT FOUND");
  111. return;
  112. }
  113. contactsbyname.get(name)
  114. .stream()
  115. .forEach(System.out::println);
  116. }
  117.  
  118. private boolean noContactWithName(String name) {
  119. return contactsbyname.containsKey(name);
  120. }
  121. }
  122.  
  123. public class PhoneBookTest {
  124.  
  125. public static void main(String[] args) {
  126. PhoneBook phoneBook = new PhoneBook();
  127. Scanner scanner = new Scanner(System.in);
  128. int n = scanner.nextInt();
  129. scanner.nextLine();
  130. for (int i = 0; i < n; ++i) {
  131. String line = scanner.nextLine();
  132. String[] parts = line.split(":");
  133. try {
  134. phoneBook.addContact(parts[0], parts[1]);
  135. } catch (DuplicateNumberException e) {
  136. System.out.println(e.getMessage());
  137. }
  138. }
  139. while (scanner.hasNextLine()) {
  140. String line = scanner.nextLine();
  141. System.out.println(line);
  142. String[] parts = line.split(":");
  143. if (parts[0].equals("NUM")) {
  144. phoneBook.contactsByNumber(parts[1]);
  145. } else {
  146. phoneBook.contactsByName(parts[1]);
  147. }
  148. }
  149. }
  150.  
  151. }
  152.  
  153.  
  154.  
  155.  
  156.  
  157. Sample input
  158.  
  159. 10
  160. Nicholas:071653488
  161. Joseph:077339727
  162. David:07732913
  163. Sophia:077959114
  164. Christopher:070556447
  165. Chloe:076481682
  166. Ashley:076522077
  167. Chloe:070332432
  168. Ethan:075278452
  169. Grace:078952211
  170. NUM:522
  171. NUM:0765
  172. NUM:0773
  173. NAME:Chloe
  174. NAME:Grace
  175. NUM:34444
  176.  
  177. Sample output
  178.  
  179. NUM:522
  180. Ashley 076522077
  181. Grace 078952211
  182. NUM:0765
  183. Ashley 076522077
  184. NUM:0773
  185. David 07732913
  186. Joseph 077339727
  187. NAME:Chloe
  188. Chloe 070332432
  189. Chloe 076481682
  190. NAME:Grace
  191. Grace 078952211
  192. NUM:34444
  193. NOT FOUND
  194.  
  195.  
  196.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement