Anagrams.java


Below is the syntax highlighted version of Anagrams.java.


/***********************************************************************
  * Donna Gabai, dgabai, P01
  * Practice exam 3 Fall 2012
  * 
  * Anagrams class to maintain a symbol table of anagrams
  * (key is alphabetized string of letters, value is Queue
  * of words entered with those letters)
  * 
  * Dependencies: ST.java, Queue.java, StringSort.java
  * 
  *********************************************************************/

public class Anagrams {
    // instance variables
    private ST<String, Queue<String>> st;  // alphabetized strings and queue
    // for each of their anagrams
    private int keyCount;                  // number of distinct keys
    private int wordCount;                 // number of distinct words
    
    // constructor - does nothing but initialize symbol table
    public Anagrams() {
        st = new ST<String, Queue<String>>();
        keyCount = 0;
        wordCount = 0;
    }
    
    // distinct keys seen
    public int numKeys() {
        return keyCount;
    }
    
    // distinct words seen
    public int numWords() {
        return wordCount;
    }
    
    // add a new word if distinct, create new key if needed
    public void add(String word) {
        // alphabetize string
        String alpha = StringSort.sort(word);
        
        // no key for it yet?
        if (!st.contains(alpha)) {
            Queue<String> wordQ = new Queue<String>();
            wordQ.enqueue(word);
            st.put(alpha, wordQ);
            keyCount++;
            wordCount++;
            return;
        }
        
        // already seen this key
        Queue<String> wordQ = st.get(alpha);
        for (String s : wordQ) {
            // word already seen?  nothing to do
            if (s.equals(word)) return;
        }
        // new word
        wordQ.enqueue(word);
        st.put(alpha, wordQ);
        wordCount++;
    }
    
    // return a set of all anagrams of w that we have seen
    public String[] getAnagrams(String w) {
        // is alphabetized w a key?
        String alpha = StringSort.sort(w);
        if (st.contains(alpha)) {
            Queue<String> wordQ = st.get(alpha);
            int size = wordQ.size();
            // transfer its queue to an array
            String[] a = new String[size];
            int i = 0;
            for (String s : wordQ) {
                a[i] = s;
                i++;
            }
            return a;
        }
        
        // w not a key, return 0-element String array
        String[] a = new String[0];
        return a;
    }
    
    // return a queue of all sets of anagrams with more than n words
    public Queue<String[]> getAnagrams(int n) {
        Queue<String[]> anagramQ = new Queue<String[]>();
        // look for sets > n and put them in the queue.
        for (String alpha : st) {
            String[] wordArray = getAnagrams(alpha);
            if (wordArray.length > n)
                anagramQ.enqueue(wordArray);
        }
        return anagramQ;
    }
    
    // return a queue of all sets of anagrams in our symbol table
    public Queue<String[]> getAnagrams() {
        return getAnagrams(0);
    }
    
    // test main
    public static void main(String[] args) {
        Anagrams tester = new Anagrams();
        tester.add("first");
        tester.add("Frist");
        StdOut.println("How many unique keys: " + tester.numKeys());
        StdOut.println("How many unique words: " + tester.numWords());
    }
}