import java.io.File;
import java.util.Comparator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/*
 * WordMap.java
 *
 * Created on February 18, 2006, 12:10 PM
 *
 * COP 3530 Example
 */

/**
 *
 * @author Bill Kraynek
 */
public class WordMap {
    
    /** Creates a new instance of WordMap */
    public WordMap() throws Exception {
        Map<String,Word> stringToWord = new TreeMap<String,Word>();
        Scanner fileScanner = new Scanner(new File("src/WordMap.java"));
        fileScanner.useDelimiter("[^a-zA-Z]+");
        while( fileScanner.hasNext() ) {
            String word = fileScanner.next();
            if( stringToWord.containsKey(word) ) {
                stringToWord.get(word).incrementCount();
            } else {
                stringToWord.put(word,new Word(word));
            }// end if
        }// end while
        String out = "Words in Alphabetic order\n\n";
        for( String w : stringToWord.keySet() ) out += stringToWord.get(w) + "\n";
        JOptionPane.showMessageDialog(null,new JScrollPane(new JTextArea(out,30,25)));
        Set<Word> words = new TreeSet<Word>(new WordCountComparator());
        words.addAll(stringToWord.values());
        out = "Words in Count order \n\n";
        for( Word w : words ) out += w + "\n";
        JOptionPane.showMessageDialog(null,new JScrollPane(new JTextArea(out,30,25)));
    }// end constructor
    
    class WordCountComparator implements Comparator<Word> {
        public int compare(Word left, Word right) {
            int difference = right.getCount() - left.getCount();
            if( difference != 0 ) return difference;
            return left.getWord().compareTo(right.getWord());
        }// end compare
    }// end class
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        new WordMap();
    }// end main
    
}

