/** Add an entry or change an existing entry. @param name The name of the person being added or changed @param number The new number to be assigned @return The old number or, if a new entry, null */ public String addOrChangeEntry(String name, String number) { String oldNumber = null; int index = find(name); if (index > -1) { oldNumber = theDirectory[index].getNumber(); theDirectory[index].setNumber(number); } else { add(name, number); } modified = true; return oldNumber; } /** Look up an entry. @param name The name of the person @return The number. If not in the directory, null is returned */ public String lookupEntry(String name) { int index = find(name); if (index > -1) { return theDirectory[index].getNumber(); } else { return null; } } /** Method to save the directory. pre: The directory has been loaded with data. post: Contents of directory written back to the file in the form of name-number pairs on adjacent lines. modified is reset to false. */ public void save() { if (modified) { // If not modified, do nothing. try { // Create PrintWriter for the file. PrintWriter out = new PrintWriter(new FileWriter(sourceName)); // Write each directory entry to the file. for (int i = 0; i < size; i++) { out.println(theDirectory[i].getName()); out.println(theDirectory[i].getNumber()); } // Close the file. out.close(); modified = false; } catch (Exception ex) { System.err.println("Save of directory failed"); ex.printStackTrace(); System.exit(1); } } } /** Find an entry in the directory. @param name The name to be found @return The index of the entry with the requested name. If the name is not in the directory, returns -1 */ private int find(String name) { for (int i = 0; i < size; i++) { if (theDirectory[i].getName().equals(name)) { return i; } } return -1; // Name not found. } /** Add an entry to the directory. @param name The name of the new person @param number The number of the new person */ private void add(String name, String number) { if (size >= capacity) { reallocate(); } theDirectory[size] = new DirectoryEntry(name, number); size++; } /** Allocate a new array to hold the directory. */ private void reallocate() { capacity *= 2; DirectoryEntry[] newDirectory = new DirectoryEntry[capacity]; System.arraycopy(theDirectory, 0, newDirectory, 0, theDirectory.length); theDirectory = newDirectory; } /** Remove an entry from the directory. @param name The name of the person to be removed @return The current number. If not in directory, null is returned */ public String removeEntry(String name) { int itemindex = find(name); if (itemindex > -1) { theDirectory[itemindex] = theDirectory[size - 1]; size--; modified = true; return name; } else { return null; } } // end remove Entry