import java.util.Random; import java.util.List; import java.util.Map; import java.util.HashMap; import java.util.TreeMap; import java.util.Iterator; /** ?? @author Jeff Smith */ public class A9 { // instance variables - replace the example below with your own private static Random r = new Random(1); // 3600 possible CVCV strings private static final char[] CONS = {'p', 't', 'k', 'b', 'd', 'g', 'm', 'n', 's', 'z', 'v', 'f'}; private static final char[] VOWELS = {'a', 'e', 'i', 'o', 'u'}; private static int NUMBER_OF_TESTS = 2048; private static String getRandomString() { StringBuffer sb = new StringBuffer(); sb.append(CONS[r.nextInt(CONS.length)]); sb.append(VOWELS[r.nextInt(VOWELS.length)]); sb.append(CONS[r.nextInt(CONS.length)]); sb.append(VOWELS[r.nextInt(VOWELS.length)]); return new String(sb); } /** ?? */ public static boolean isSortedByName(List accountList) { Iterator accountIterator = accountList.iterator(); if (!accountIterator.hasNext()) return true; BankAccount secondAccount = accountIterator.next(); while (accountIterator.hasNext()) { BankAccount firstAccount = secondAccount; secondAccount = accountIterator.next(); if (firstAccount.compareTo(secondAccount) > 0) return false; } return true; } /** ?? */ public static boolean isSortedByBalance(List accountList) { Iterator accountIterator = accountList.iterator(); if (!accountIterator.hasNext()) return true; BankAccount secondAccount = accountIterator.next(); while (accountIterator.hasNext()) { BankAccount firstAccount = secondAccount; secondAccount = accountIterator.next(); if (firstAccount.getBalance() < secondAccount.getBalance()) return false; } return true; } /** ?? @param args is ignored */ public static void main(String[] args) { System.out.print("++++++++++"); System.out.print(" For TreeBank " + NUMBER_OF_TESTS + " tests "); System.out.println("++++++++++"); testBank(new TreeBank(2.0), NUMBER_OF_TESTS); System.out.print("++++++++++"); System.out.print(" For HashBank " + NUMBER_OF_TESTS + " tests "); System.out.println("++++++++++"); testBank(new HashBank(2.0), NUMBER_OF_TESTS); System.out.print("++++++++++"); System.out.print(" For TreeBank " + 2*NUMBER_OF_TESTS + " tests "); System.out.println("++++++++++"); testBank(new TreeBank(10.0), 2*NUMBER_OF_TESTS); System.out.print("++++++++++"); System.out.print(" For HashBank " + 2*NUMBER_OF_TESTS + " tests "); System.out.println("++++++++++"); testBank(new HashBank(10.0), 2*NUMBER_OF_TESTS); } public static void testBank(Bank myBank, int numberOfTests) { long startTime; r = new Random(0); if (myBank.addAccount(null)) System.out.println("null account added!"); else System.out.println("attempt to add null account detected"); try { BankAccount account = new CheckingAccount(null, 0); } catch(Exception e) { System.out.println(e.getMessage()); } try { BankAccount account = new SavingsAccount(null, 0); } catch(Exception e) { System.out.println(e.getMessage()); } System.out.println(); // add the accounts to a new bank // note that the average account has very nearly $1000.00 startTime = System.nanoTime(); for (int i=1; i<=numberOfTests; i++) { if (r.nextBoolean()) myBank.addAccount( new CheckingAccount (getRandomString(), 2000*r.nextDouble())); else myBank.addAccount( new SavingsAccount (getRandomString(), 2000*r.nextDouble())); } System.out.println("time in microseconds to add accounts = " + (System.nanoTime() - startTime)/1000); System.out.println("total balance = " + myBank.getTotalBalance() + " in " + myBank.getNumberOfAccounts() + " accounts"); System.out.println(); // search for accounts for many account holder names r.setSeed(2); startTime = System.nanoTime(); int numberFound = 0; for (int i=1; i<=numberOfTests; i++) { String accountHolder = getRandomString(); BankAccount accountFound = myBank.getAccount(accountHolder); if (accountFound != null) numberFound++; } System.out.println("time in microseconds to seek accounts = " + (System.nanoTime() - startTime)/1000); System.out.println("accounts found = " + numberFound); System.out.println("total balance = " + myBank.getTotalBalance() + " in " + myBank.getNumberOfAccounts() + " accounts"); System.out.println(); // try removing the accounts for the same account holder names r.setSeed(2); startTime = System.nanoTime(); int numberRemoved = 0; for (int i=1; i<=numberOfTests; i++) { String accountHolder = getRandomString(); boolean isRemoved = myBank.removeAccount(accountHolder); if (isRemoved) numberRemoved++; } System.out.println("time in microseconds to remove accounts = " + (System.nanoTime() - startTime)/1000); System.out.println("accounts removed = " + numberRemoved); System.out.println("total balance = " + myBank.getTotalBalance() + " in " + myBank.getNumberOfAccounts() + " accounts"); System.out.println(); // try removing the accounts for the same account holder names r.setSeed(2); startTime = System.nanoTime(); numberRemoved = 0; for (int i=1; i<=numberOfTests; i++) { String accountHolder = getRandomString(); myBank.removeAccount(accountHolder); } System.out.println("time in microseconds to remove accounts = " + (System.nanoTime() - startTime)/1000); System.out.println("accounts removed = " + numberRemoved); System.out.println("total balance = " + myBank.getTotalBalance() + " in " + myBank.getNumberOfAccounts() + " accounts"); System.out.println(); // try getting a list of accounts, sorted by account name List accountList = myBank.getAccountList(); startTime = System.nanoTime(); List sortedAccountList = myBank.getSortedAccountList(); System.out.println("time in microseconds to generate sorted list = " + (System.nanoTime() - startTime)/1000); System.out.print("The account list returned without sorting "); System.out.print( isSortedByName(accountList) ? "is" : "is not"); System.out.println(" sorted"); System.out.print("The account list to be sorted by account holder name "); System.out.print( isSortedByName(sortedAccountList) ? "is" : "is not"); System.out.println(" sorted"); System.out.println(); // try getting a list of accounts, sorted by balance (largest first) startTime = System.nanoTime(); sortedAccountList = myBank.getAccountListSortedByBalance(); System.out.println("time in microseconds to generate list sorted" + " by balance= " + (System.nanoTime() - startTime)/1000); System.out.print("The account list to be sorted by balance "); System.out.print( isSortedByBalance(sortedAccountList) ? "is" : "is not"); System.out.println(" sorted"); System.out.println(); // pay interest to the remaining (savings) accounts myBank.payInterest(); System.out.println("total balance after paying interest = " + myBank.getTotalBalance() + " in " + myBank.getNumberOfAccounts() + " accounts"); System.out.println(myBank.getAccount(null)); System.out.println(myBank.removeAccount(null)); System.out.println(); } }