Contador de Frequencia de palavras

Galera to com um programa q le um frase e imprimi a ocorrencia de cada palavras nessa frase, porem eu preciso q ele imprimi por de maior ocorrencia para a menos na saida… se alguem puder ajudaa!

//ContadorFrequencia.java
//Programa conta o numero de ocorrencias de cada palavra em uma frase

import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;
import java.util.Scanner;


public class ContadorFrequencia
{
    private Map< String , Integer> mapa;
    private Scanner leitura;

	public ContadorFrequencia()
	{
            mapa = new HashMap < String, Integer >(); //Cria o HashMap
            leitura = new Scanner( System.in ); //Faz a leitura da frase
            criarMapa(); // Cria Mapa baseado na entrada de usuario
            mostrarMapa();// Exibe conteudo do Mapa
	}

	// Cria Mapa baseado na entrada de usuario
	private void criarMapa()
	{
            System.out.println("Entre com a frase"); // Solicita a entrada da frase do usuario
            String input= leitura.nextLine();

            // Cria StringTokenizer para a frase de entrada
            StringTokenizer quebraFrase = new StringTokenizer( input );

            //Processamento de texto de entrada
            while (quebraFrase.hasMoreTokens())//Enquanto houver mais entradas
            {
		String palavra = quebraFrase.nextToken().toLowerCase(); // Obtem palavra

		// Se o mapa tiver a palavra
		if (mapa.containsKey( palavra )) // Palavras esta no mapa
		{
                    int contador = mapa.get( palavra ); // Obtem contagem atual
                    mapa.put( palavra, contador+1); // Incrementa a contagem
		}
		else
                    mapa.put( palavra, 1 ); // Adiciona uma nova palavra com contagem de 1 ao mapa
		}
	}

	// Exibe conteudo do mapa
	private void mostrarMapa()
	{
            Set< String > keys = mapa.keySet(); // Obtem as classes

            // Classifica as classes
            TreeSet< String > orderedKeys = new TreeSet< String > ( keys );
            System.out.println ("Palavras Contidas na frase: \nPalavras\t\t Ocorrencias");

            // Gera a saida de cada chave no mapa
            for ( String key : orderedKeys )
            System.out.printf ("%-10s%10s\n", key, mapa.get( key ));

            System.out.printf ("\nQuantidade de palavras:%d\nFrase esta vazia%b\n", mapa.size(), mapa.isEmpty());
	}

	public static void main(String[] args)
	{
            new ContadorFrequencia();
	}

} 

Vlwww, abraçoO!

Crie um novo TreeMap <Integer, List >, onde a chave é a frequência e o valor é uma lista das palavras que têm a mesma frequência.
Como o TreeMap lista em ordem crescente, você pode usar um truque - criar o TreeMap com um Comparator que compara em ordem decrescente.

Vou dar um exemplo bobo.

Map<Integer, List<String>> t = new TreeMap<Integer, List<String>> (Collections.reverseOrder());

Uma sugestão (que não tem a ver exatamente com seu problema). Prefira usar String.split a usar StringTokenizer (se você procurar aqui no fórum sobre isso vai entender porque). Minha sugestão é: não use StringTokenizer.

Uma coisa de que sinto falta no Java é de uma coisa semelhante ao boost::multiindex. ( http://www.boost.org/doc/libs/1_43_0/libs/multi_index/doc/index.html )

Usando isso, seria possível ter um registro do tipo que o Wellington mostrou,
e indexar uma lista desses registros por dois índices: um por frequência e outro por palavra.

Outra opção seria criar uma classe

class Palavra { String palavra; int frequencia; }

E guardá-las numa TreeSet, antes verificando se a mesma já existe. Se existir, mantêm e apenas incrementa a frequência. Se não existir, adiciona.

Você terá que implementar o equals e hashCode para verificar se a mesma existe e implementar a interface Comparable para que a TreeSet fique do jeito que deseja (ordenada de modo decrescente).

Concordo com o marcobiscaro2112: