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 ?