/**
 * A class to store names and numbers in a phone book.
 * Methods for adding a name and number to the book, and
 * for looking up a name, are included.
 * @author Frederic Green <br>CS120, Fall 2007 <br>Clark University
 */
public class PhoneBook {
 //Instance variables:
 //The phone book itself:
 private PhoneBookRecord [] book;
 //Number of entries used:
 private int numberInBook;
 //Capacity of the phone book:
 private int maxSize;
 
 /**
  * Constructor that creates a book with at most 100 names.
  */
 public PhoneBook () {
  numberInBook = 0;
  maxSize = 100;
  book = new PhoneBookRecord[maxSize];
  int i;
  for (i = 0; i < maxSize; i++)
   book[i] = null;
 }//PhoneBook constructor

 /**
  * Constructor that creates a book with at most the given number
  * of names.
  * @param  Maximum The capacity of the phone book.
  */
 public PhoneBook (int maximum) {
  numberInBook = 0;
  maxSize = maximum;
  book = new PhoneBookRecord[maxSize];
  for (int i = 0; i < book.length; i++)
   book[i] = null;
 }//PhoneBook constructor
 
 /**
  * Method to add given name and number to the phone book.
  * @param  aName   The name to add.
  * @param  aNumber The number to add.
  */
 public void addToBook (String aName, String aNumber) {
  if (numberInBook < maxSize) {
    book[numberInBook] = new PhoneBookRecord(aName, aNumber);
    numberInBook++;
   }
  else
   System.out.println("Sorry, no one else permitted in this area code!");
 }//addToBook
 
 /**
  * Method to return the number corresponding to the given name.
  * @param  aName   The given name.
  * @return A String containing the number.
  */
 public String lookUp (String aName) {
  int i;
  for (i=0; i < numberInBook; i++)
   if (aName.equals(book[i].getName()))
    break;
  
  if (i < numberInBook)
   return book[i].getNumber();
  else
   return "Unlisted number";
 }//lookUp
 
 /**
  * Method to print all the names and numbers in the book.
  */
 public void printBook () {
  System.out.println("Here are the names and numbers:");
  System.out.println("Name\t\t\tNumber");
  for (int i = 0; i < numberInBook; i++)
   System.out.println(book[i]);
 }
 
 /**
  * Method to sort the phone book in alphabetical order
  * according to name.
  */
 //The algorithm used is selection sort.
 public void sort () {
    int indexOfSmallest;
    PhoneBookRecord temp;       
    for (int i=0; i < numberInBook; i++) {
      indexOfSmallest = indexOfSmallest(i);
      temp = book[i];
      book[i] = book[indexOfSmallest];
      book[indexOfSmallest] = temp;
     }//for
 }//sort
       
 //Support method to find index of smallest element.
 private int indexOfSmallest (int start)
 {
    int indexOfMinimum = start;
    PhoneBookRecord smallest = book[start];        
    for (int i=start+1; i < numberInBook; i++)
      if ((book[i].getName()).compareTo(smallest.getName()) < 0)
        {
           smallest = book[i];
           indexOfMinimum = i;
        }            
    return indexOfMinimum;          
 }//indexOfSmallest
}//PhoneBook class