Ordernar um Map pelo valor

Galera estou com um problema para ordenar um Map.
Eu tenho map do tipo

TreeMap<String,List<Integer>> rank =new TreeMap<String,List<Integer>>(); 

em que a string é uma palavra e a list são os anos em que essa palavra ocorreu na base de dados.
Preciso ordenar esse map pelo tamanho da list. A palavra que tiver mais ocorrência fica mais bem colocada.

Não sei se TreeMap é a melhor opção. Sei também que tenho que implemetar a interface Comparator mais
não sei como. Alguém tem alguma idéia ?

Você pode criar uma classe que encapsule os 2, tendo a String e a lista, e nessa classe você implementa a interface Comparable, comparando pelo tamanho da lista.

Deixa eu ver se entendi, ficaria +/- assim


public class Rank implements Comparator<Rank> {
    
     String term;
     List<Integer> occu = new ArrayList<Integer>();


     //Metodos get's e set's

    @Override
    public int compare(Rank r1,Rank r2){
           if(r2.occu.size() < r1.occu.size())
                 return -1;
           else
                 return 1;

    } 
}

Minha dúvida é como eu faria o TreeMap ordenar pelo Objeto Rank, já que eu teria um TreeMap do tipo:

TreeMap<String,Rank> rankTerms = new TreeMap<String,Rank>();

Você não vai ter um TreeMap mais. Acho que um TreeSet funcionaria, caso você queira evitar termos repetidos, terá que implementar equals em Rank também.

Mas e se eu quiser pesquisar um objeto do tipo Rank no TreeSet pelo atributo term
tem como ??

Então galera o TreeSet funcionou perfeitamente, está ordenando corretamente. Mas ainda tenho um problema.
Preciso pesquisar se um termo está no rankTerms. Tentei criar um uma Objeto Rank e usar a função contains, mas não funcionou. Tiver problemas também com a função remove do TreeSet.


ArrayList<Integer> occu1 = new ArrayList<Integer>();
occu1.add(2000);
occu1.add(2001);
occu1.add(2004);

Rank r1 = new Rank();
r1.setTerm("guj");
r1.setOccu(occu1);

rankTerms.add(r1);
System.out.println(rankTerms.contains(r1));
rankTerms.remove(r1);
System.out.println(rankTerms.contains(r1));

Olhando o Javadoc vi que as funções contains e remove do TreeSet recebem um parametro Object. Tentei dar um cast ao usar a função mais o resultado foi o mesmo.
A função contains e remove só retornam false.

Alguém sabe como posso resolver esse problema ?