Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Да се имплементира класа за именик PhoneBook со следните методи:
- void addContact(String name, String number) - додава нов контакт во именикот. Ако се обидеме да додадеме контакт со веќе постоечки број, треба да се фрли исклучок од класа DuplicateNumberException со порака Duplicate number: [number]. Комплексноста на овој метод не треба да надминува O(logN) за N контакти.
- void contactsByNumber(String number) - ги печати сите контакти кои во бројот го содржат бројот пренесен како аргумент во методот (минимална должина на бројот [number] е 3). Комплексноста на овој метод не треба да надминува O(logN) за N контакти.
- void contactsByName(String name) - ги печати сите контакти кои даденото име. Комплексноста на овој метод треба да биде O(1).
- Во двата методи контактите се печатат сортирани лексикографски според името, а оние со исто име потоа според бројот.
- import java.util.*;
- class DuplicateNumberException extends Exception {
- public DuplicateNumberException(String message) {
- super(message);
- }
- }
- class Contact implements Comparable<Contact> {
- private String name;
- private String number;
- public Contact(String name, String number) {
- this.name = name;
- this.number = number;
- }
- public String getName() {
- return name;
- }
- public String getNumber() {
- return number;
- }
- @Override
- public String toString() {
- return String.format("%s %s", name, number);
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Contact contact = (Contact) o;
- return Objects.equals(name, contact.name)&&Objects.equals(number, contact.number);
- }
- @Override
- public int hashCode() {
- return Objects.hash(name, number);
- }
- @Override
- public int compareTo(Contact o) {
- int res = this.name.toLowerCase().compareTo(o.name.toLowerCase());
- if(res == 0)
- return this.number.compareTo(o.number);
- return res;
- }
- }
- class PhoneBook {
- private Map<String, Contact> contactByNumber;
- private Map<String,Set<Contact>> contactsbyname;
- public PhoneBook() {
- contactsbyname = new TreeMap<>();
- contactByNumber = new HashMap<>();
- }
- public void addContact(String name, String number) throws DuplicateNumberException {
- if (contactByNumber.containsKey(number))
- throw new DuplicateNumberException(number);
- Contact contact = new Contact(name, number);
- contactByNumber.put(number, contact);
- contactsbyname.putIfAbsent(name, new TreeSet<>());
- contactsbyname.computeIfPresent(name, (k, v) -> {
- v.add(contact);
- return v;
- });
- }
- public void contactsByNumber(String number) {
- if (!noContactWithNumber(number)) {
- System.out.println("NOT FOUND");
- return;
- }
- contactByNumber
- .entrySet()
- .stream()
- .filter(each -> each.getKey().contains(number))
- .map(each -> each.getValue())
- .sorted(Contact::compareTo)
- .forEach(System.out::println);
- }
- private boolean noContactWithNumber(String number) {
- return !contactByNumber
- .keySet()
- .stream()
- .filter(n -> n.contains(number))
- .findFirst().orElse("").equals("");
- }
- public void contactsByName(String name) {
- if (!noContactWithName(name)) {
- System.out.println("NOT FOUND");
- return;
- }
- contactsbyname.get(name)
- .stream()
- .forEach(System.out::println);
- }
- private boolean noContactWithName(String name) {
- return contactsbyname.containsKey(name);
- }
- }
- public class PhoneBookTest {
- public static void main(String[] args) {
- PhoneBook phoneBook = new PhoneBook();
- Scanner scanner = new Scanner(System.in);
- int n = scanner.nextInt();
- scanner.nextLine();
- for (int i = 0; i < n; ++i) {
- String line = scanner.nextLine();
- String[] parts = line.split(":");
- try {
- phoneBook.addContact(parts[0], parts[1]);
- } catch (DuplicateNumberException e) {
- System.out.println(e.getMessage());
- }
- }
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine();
- System.out.println(line);
- String[] parts = line.split(":");
- if (parts[0].equals("NUM")) {
- phoneBook.contactsByNumber(parts[1]);
- } else {
- phoneBook.contactsByName(parts[1]);
- }
- }
- }
- }
- Sample input
- 10
- Nicholas:071653488
- Joseph:077339727
- David:07732913
- Sophia:077959114
- Christopher:070556447
- Chloe:076481682
- Ashley:076522077
- Chloe:070332432
- Ethan:075278452
- Grace:078952211
- NUM:522
- NUM:0765
- NUM:0773
- NAME:Chloe
- NAME:Grace
- NUM:34444
- Sample output
- NUM:522
- Ashley 076522077
- Grace 078952211
- NUM:0765
- Ashley 076522077
- NUM:0773
- David 07732913
- Joseph 077339727
- NAME:Chloe
- Chloe 070332432
- Chloe 076481682
- NAME:Grace
- Grace 078952211
- NUM:34444
- NOT FOUND
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement