import java.io.*; import java.util.*; class PhoneDirectory { private Hashtable phoneBook; private ArrayDeque callingHistory; public static ArrayDeque operationHistory; private static final String FILE_NAME = "phone_directory.txt"; private static final String CALLING_HISTORY_FILE_NAME = "callinghistory.txt"; public PhoneDirectory() { phoneBook = new Hashtable(); callingHistory = new ArrayDeque(); operationHistory = new ArrayDeque(); } public void addContact(String name, String phoneNumber) { phoneBook.put(name, phoneNumber); operationHistory.addFirst("add" + name); } public void removeContact(String name) { if (phoneBook.containsKey(name)) { phoneBook.remove(name); operationHistory.addFirst("remove" + name); System.out.println(name + " removed successfully"); } } public void searchContact(String name) { String phoneNumber = phoneBook.get(name); if (phoneNumber != null) { System.out.println("Contact found:"); System.out.println("Name: " + name); System.out.println("Phone Number: " + phoneNumber); operationHistory.addFirst("search" + name); } else { System.out.println("Contact not found."); } } public void displayAllContacts() { if (phoneBook.isEmpty()) { System.out.println("Phone Directory is empty."); return; } System.out.println("Phone Directory:"); for (String name : phoneBook.keySet()) { System.out.println("Name:" + name + ", Phone Number:" + phoneBook.get(name)); } operationHistory.addFirst("displayed all contacts"); } public void renameContact(String oldName, String newName) { if (phoneBook.containsKey(oldName)) { String phoneNumber = phoneBook.get(oldName); phoneBook.remove(oldName); phoneBook.put(newName, phoneNumber); operationHistory.addFirst("rename " + oldName + "to" + newName); System.out.println("rename of " + oldName + " is successful"); } } public void callContact(String name) { String phoneNumber = phoneBook.get(name); if (phoneNumber != null) { callingHistory.add(name); operationHistory.addFirst("call " + name); System.out.println("Calling..." + name); } else { System.out.println("Contact not found. Cannot call."); } } public void savePhoneDirectoryToFile() { try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME))) { for (String name : phoneBook.keySet()) { writer.write(name + "," + phoneBook.get(name)); writer.newLine(); } } catch (IOException e) { e.printStackTrace(); } } public void saveCallingHistoryToFile() { try (BufferedWriter writer = new BufferedWriter(new FileWriter(CALLING_HISTORY_FILE_NAME))) { for (String calledContact : callingHistory) { writer.write(calledContact); writer.newLine(); } } catch (IOException e) { e.printStackTrace(); } } public void loadPhoneDirectoryFromFile() { try (BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME))) { String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(","); if (parts.length == 2) { phoneBook.put(parts[0], parts[1]); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { PhoneDirectory phoneDirectory = new PhoneDirectory(); phoneDirectory.loadPhoneDirectoryFromFile(); File fl = new File(FILE_NAME); fl.createNewFile(); File f2 = new File(CALLING_HISTORY_FILE_NAME); f2.createNewFile(); Scanner scanner = new Scanner(System.in); int choice; String name, phoneNumber, newName; do { System.out.println("\nPhone Directory Management System"); System.out.println("1. Add a Contact"); System.out.println("2. Remove a Contact"); System.out.println("3. Search for a Contact"); System.out.println("4. Display All Contacts"); System.out.println("5. Rename a Contact"); System.out.println("6. Call a Contact"); System.out.println("7. Exit"); System.out.print("Enter your choice: "); choice = scanner.nextInt(); scanner.nextLine(); // Clear the newline character from the buffer switch (choice) { case 1: System.out.print("Enter the name of the contact: "); name = scanner.nextLine(); System.out.print("Enter the phone number: "); phoneNumber = scanner.nextLine(); phoneDirectory.addContact(name, phoneNumber); phoneDirectory.savePhoneDirectoryToFile(); break; case 2: System.out.print("Enter the name of the contact to remove: "); name = scanner.nextLine(); phoneDirectory.removeContact(name); phoneDirectory.savePhoneDirectoryToFile(); break; case 3: System.out.print("Enter the name of the contact to search: "); name = scanner.nextLine(); phoneDirectory.searchContact(name); break; case 4: phoneDirectory.displayAllContacts(); break; case 5: System.out.print("Enter the name of the contact to rename: "); name = scanner.nextLine(); System.out.print("Enter the new name: "); newName = scanner.nextLine(); phoneDirectory.renameContact(name, newName); phoneDirectory.savePhoneDirectoryToFile(); break; case 6: System.out.print("Enter the name of the contact to call: "); name = scanner.nextLine(); phoneDirectory.callContact(name); phoneDirectory.saveCallingHistoryToFile(); break; case 7: System.out.println("Exiting Phone Directory Management System."); break; default: System.out.println("Invalid choice. Please try again."); break; } } while (choice != 7); System.out.println("Recent Operations History: "); for (String s : operationHistory) { System.out.println(s); } scanner.close(); } }