import java.io.File;
import java.util.StringTokenizer;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;
import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;

public class TreeMapExample {
    Map<String,Integer> wordFrequencies;
    
    public TreeMapExample() {
        wordFrequencies = new TreeMap<String,Integer>();
        try {
            Scanner in = new Scanner(new File("src/TreeMapExample.java"));
            in.useDelimiter("[^a-zA-Z]+");
            while( in.hasNext() ) {
                String aWord = in.next();
                if( !wordFrequencies.containsKey(aWord) ) {
                    wordFrequencies.put(aWord,0);
                } // end if
                wordFrequencies.put(aWord,wordFrequencies.get(aWord)+1);
            } // end while
        } catch(Exception e) {
            JOptionPane.showMessageDialog(null,e);
            e.printStackTrace();
        } // end try/catch
        String out = "";
        Iterator<String> wordsItr = wordFrequencies.keySet().iterator();
        while( wordsItr.hasNext() ) {
            String aWord = wordsItr.next();
            int frequency = wordFrequencies.get(aWord);
            out += aWord + " appeared " + frequency + " time" + (frequency>1?"s":"") + ".\n";
        } // end while
        JTextArea outArea = new JTextArea(40,40);
        outArea.setText(out);
        JOptionPane.showMessageDialog(null,new JScrollPane(outArea));
        Map<String,Integer> frequencyWords =  new TreeMap<String,Integer>(new CompareWordsByFrequency());
        frequencyWords.putAll(wordFrequencies);
        out = "";
        for( String aWord : frequencyWords.keySet()) {
            int frequency = frequencyWords.get(aWord);
            out += aWord + " appeared " + frequency + " time" + (frequency>1?"s":"") + ".\n";
        } // end while
        outArea.setText(out);
        JOptionPane.showMessageDialog(null,new JScrollPane(outArea));
    } // end constructor
    
    class CompareWordsByFrequency implements Comparator<String> {
        public int compare(String left, String right) {
            int leftFreq = wordFrequencies.get(left);
            int rightFreq = wordFrequencies.get(right);
            if( leftFreq != rightFreq ) {
                return rightFreq - leftFreq;
            } else {
                return left.compareTo(right);
            } // end else
        } // end compare
    } // end CompareWordsByFrequency
    
    public static void main(String[] args) {
        new TreeMapExample();
        System.exit(0);
    } // end main
    
} // end TreeMapExample


