// TestHashtableArraylist.java
// Test some Hashtable and ArrayList ideas
// RJM Programming
// December, 2014

import java.util.ArrayList; 
import java.util.Hashtable;
import java.util.Scanner;
import java.util.Enumeration;
import java.util.*;

public class TestHashtableArraylist {

 public class HashtableArraylist {
  private int number;
  private String name;
  private String email;

  public void setNumber(int p_number) {
   this.number = p_number;
  }

  public void setName(String p_name) {
   this.name = p_name;
  }

  public void setEmail(String p_email) {
   this.email = p_email;
  }

  public int getNumber() { return this.number; }
  public String getName() { return this.name; }
  public String getEmail() { return this.email; }
 }
 
 public static Hashtable<String,String> contactsHT = new Hashtable<String,String>();
 public static List<String> sortingName = new ArrayList<String>();
 public static List<String> sortingEmail = new ArrayList<String>();
 public static List<String> sortingNameEmail = new ArrayList<String>();
 public static List<String> sortingEmailName = new ArrayList<String>();

 public static Hashtable<String,String> contactsHTEmail = new Hashtable<String,String>();

 public List<String> getContactList() {
  int number = 0;
  String ourstring;
  String ourname;
  String ouremail;
  Scanner scanner = new Scanner(System.in);
  scanner.useDelimiter("\\n");
  System.out.println("Contact List\n------------\n\nEnter Name,Email 1 <cr> exits: ");
  ourstring = scanner.next();
  while (ourstring.replace("\n", "").trim() != "" && ourstring.replace("\n", "").length() > 0) {
   if (ourstring.indexOf(",") >= 0) {
     ourname = ourstring.substring(0, ourstring.indexOf(",")).replace(",", "");
     ouremail = ourstring.replace(ourname, "").replace(",", "");
   } else {
     ourname = ourstring;
     ouremail = "";
     while (ouremail == "") {
       ouremail = scanner.next();
     }
   }
   HashtableArraylist cl = new HashtableArraylist();
   cl.setName(ourname);
   cl.setEmail(ouremail);
   cl.setNumber(number);
   contactsHT.put(ourname, ouremail);
   contactsHTEmail.put(ouremail, ourname);
   number++;
   System.out.println("Enter Name,Email " + (number + 1) + " <cr> exits: ");
   ourstring = scanner.next();
   sortingName.add(ourname);
   sortingNameEmail.add(ourname + "," + ouremail);
   sortingEmailName.add(ouremail + "," + ourname);
  }

  // Can do enumerations ... after collection ... as below ...
  for (Enumeration<String> e = contactsHT.elements(); e.hasMoreElements();) {
   sortingEmail.add(e.nextElement());
  }
  
  // Sort ArrayList collections
  Collections.sort(sortingName);  
  Collections.sort(sortingEmail);  
  Collections.sort(sortingNameEmail);  
  Collections.sort(sortingEmailName);  
  return sortingName;
 }
 
 
 public static String getmeNominatedName(int n) {
  System.out.println("Name " + (n + 1) + " of a sorted list (of " +  sortingName.size() + ") is: " + sortingName.get(n));
  return sortingName.get(n);
 }
 
 public static String getmeNominatedNameEmail(int n) {
  String ours = sortingNameEmail.get(n);
  System.out.println("Name " + (n + 1) + " of a sorted list (of " +  sortingNameEmail.size() + ") has the email: " + ours.substring(ours.indexOf(",")).replace(",", ""));
  return ours;
 }
 
 public static String getmeNominatedEmail(int n) {
  System.out.println("Email " + (n + 1) + " of a sorted list (of " +  sortingEmail.size() + ")  is: " + sortingEmail.get(n));
  return sortingEmail.get(n);
 }
 
 public static String getmeNominatedEmailName(int n) {
  String ours = sortingEmailName.get(n);
  System.out.println("Email " + (n + 1) + " of a sorted list (of " +  sortingEmailName.size() + ")  has the name: " + ours.substring(ours.indexOf(",")).replace(",", ""));
  return ours;
 }
 
 public static String getmeLastEmail() {
  System.out.println("Last email of a sorted list (of " +  sortingEmail.size() + ")  is: " + sortingEmail.get(sortingEmail.size() - 1));
  return sortingEmail.get(sortingEmail.size() - 1);
 }
 
 public static String getmeLastEmailName() {
  String ours = sortingEmailName.get(sortingEmailName.size() - 1);
  System.out.println("Last email of a sorted list (of " +  sortingEmailName.size() + ")  has the name: " + ours.substring(ours.indexOf(",")).replace(",", ""));
  return ours;
 }
 
 public static String getmeFirstEmail() {
  System.out.println("First email of a sorted list (of " +  sortingEmail.size() + ")  is: " + sortingEmail.get(0));
  return sortingEmail.get(0);
 }
 
 public static String getmeFirstEmailName() {
  String ours = sortingEmailName.get(0);
  System.out.println("First email of a sorted list (of " +  sortingEmailName.size() + ")  has the name: " + ours.substring(ours.indexOf(",")).replace(",", ""));
  return ours;
 }
  
 public static String getmeEmailForName(String ourn) {
  System.out.println("Email for " + ourn + " is: " + contactsHT.get(ourn));
  return contactsHT.get(ourn);
 }
  
 public static String getmeNameForEmail(String ourn) {
  System.out.println("Name for " + ourn + " is: " + contactsHTEmail.get(ourn));
  return contactsHTEmail.get(ourn);
 }

 
 public static String getmeLastName() {
  System.out.println("Last name of a sorted list (of " +  sortingName.size() + ")  is: " + sortingName.get(sortingName.size() - 1));
  return sortingName.get(sortingName.size() - 1);
 }
 
 public static String getmeLastNameEmail() {
  String ours = sortingNameEmail.get(sortingNameEmail.size() - 1);
  System.out.println("Last name of a sorted list (of " +  sortingNameEmail.size() + ")  has the email: " + ours.substring(ours.indexOf(",")).replace(",", ""));
  return ours;
 }
 
 public static String getmeFirstName() {
  System.out.println("First name of a sorted list (of " +  sortingName.size() + ")  is: " + sortingName.get(0));
  return sortingName.get(0);
 }
 
 public static String getmeFirstNameEmail() {
  String ours = sortingNameEmail.get(0);
  System.out.println("First name of a sorted list (of " +  sortingNameEmail.size() + ")  has the email: " + ours.substring(ours.indexOf(",")).replace(",", ""));
  return ours;
 }

 public static void main(String[] args) {
   // Command line name of interest? ...
   String nameOfInterest = "Smith";
   String prefix = "";
   
   if (args.length >= 1) {
    nameOfInterest = "";
    for (int i=0; i<=args.length - 1; i++) {
      nameOfInterest = nameOfInterest + prefix + args[i];
      prefix = " ";
    }
   }
   
   // Initialize ...
   TestHashtableArraylist testha = new TestHashtableArraylist();
   
   // Gather data ...
   sortingName = testha.getContactList();
   
   // Report findings ...
   String smithsemail = getmeEmailForName(nameOfInterest);
   
   getmeFirstName();
   getmeFirstNameEmail();
   if (sortingName.size() >= 3) {
    getmeNominatedName(2);
    getmeNominatedNameEmail(2);
   }
   getmeLastName();
   getmeLastNameEmail();
   
   getmeFirstEmail();
   getmeFirstEmailName();
   if (sortingEmail.size() >= 3) {
    getmeNominatedEmail(2);
    getmeNominatedEmailName(2);
   }
   getmeLastEmail();
   getmeLastEmailName();
   
   if (1 == 2 && smithsemail != null) {
     String smithsname = getmeNameForEmail(smithsemail);
   }
   
   System.out.println("Email for " + nameOfInterest + " is: " + smithsemail);
 }
}

