import javax.swing.JOptionPane; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; /** * A dictionary, i.e., a set of words that is quick to search. * @author Doug Baldwin */ public class Dictionary { // Internally, a dictionary is a chained hash table. Since realistic // lists of words are long, the nominal size of the table is around // 100,000 entries. private final static int TABLE_SIZE = 93563; private WordList[] hashTable; // Compute a hash code for a string. This hash function multiplies // each character code in the string by its position in the string // (counting from 1, to include the first character in the hash code) // and adds up all the products. It does all of this modulo the table // size to ultimately produce an index into the hash table. private static int hash( String word ) { int code = 0; for ( int c = 0; c < word.length(); c++ ) { int product = ((int)word.charAt(c)) * ( c + 1 ); code = ( code + product ) % TABLE_SIZE; } return code; } /** * Initialize a dictionary to contain all the words in a specified file. * @param pathName The name of the file from which to build the dictionary. * @throws FileNotFoundException If the file from which to initialize the * dictionary doesn't exist. */ public Dictionary( String pathName ) throws FileNotFoundException { // Create the hash table for this dictionary. hashTable = new WordList[ TABLE_SIZE ]; for ( int i = 0; i < TABLE_SIZE; i++ ) { hashTable[i] = new WordList(); } // Connect a scanner to the word file. Scanner in = new Scanner( new File( pathName ) ); // Read all the words from the file, adding each to the dictionary // hash table. while ( in.hasNext() ) { String word = in.next(); this.add( word ); } } /** * Add a word to a dictionary. The word should not already be in * that dictionary. * @param word The word to add. */ public void add( String word ) { hashTable[ Dictionary.hash(word) ].add( word ); } /** * Search for a word in a dictionary. * @param word The word to seek. * @return true if the word is in the dictionary, false if not. */ public boolean find( String word ) { return hashTable[ Dictionary.hash(word) ].find( word ); } /** * Test the dictionary class. * @param args Command-line arguments; ignored. */ public static void main( String[] args ) { // Create a dictionary from the Unix dictionary file, // "/usr/share/dict/web2." That file should always be found, // but watch for an exception just in case. (And anyone // using this on a non-Mac OS computer may have a dictionary // in a different location.) try { Dictionary dict = new Dictionary( "/usr/share/dict/web2" ); // Get strings from the user and look them up until the user // decides to stop. String word = JOptionPane.showInputDialog( "Enter a word to look up." ); while ( word != null ) { if ( dict.find( word ) ) { System.out.println( "'" + word + "' is in the dictionary." ); } else { System.out.println( "'" + word + "' is not in the dictionary." ); } word = JOptionPane.showInputDialog( "Enter a word to look up." ); } } catch ( FileNotFoundException e ) { System.err.println( "That's odd, the dictionary doesn't exist." ); } } }