terça-feira, 11 de setembro de 2007

Como ordenar um hashmap pelo valor?

Para ordenar um hashmap, eu poderia converte-lo em um treemap, mas isso iria ordenar as informações pela chave, e não pelo valor.

Como não consegui uma solução mais "automágica" criei um método pra fazer isso...

A idéia é pegar os Entry (conjunto de chave e valor) convertidos em Array, apartir dai, ordenar o array pelo valor do Entry e então recriar o Map, mas dessa vez eu precisaria utilizar o LinkedHashMap para manter a ordem em que os objetos ficaram após a ordenação dentro do array.

Claro que eu poderia retornar o Array ordenado... :D

Ah! Já ia me esquecendo, é necessário que o valor do hash implemente Comparable

Veja o código ilustrativo...

public static Map ordDesc(Map map) {
Object[] entries = map.entrySet().toArray();
Arrays.sort(entries, new Comparator() {

public int compare(Object lhs, Object rhs) {
Map.Entry le = (Map.Entry) lhs;
Map.Entry re = (Map.Entry) rhs;
return (
(Comparable) re.getValue()).compareTo(
(Comparable) le.getValue()
);
}
});

Map h = new LinkedHashMap();
for(int i =0; i < 10; i++){
Map.Entry entry = (Map.Entry)entries[i];
h.put(entry.getKey(), entry.getValue());
}
return h;
}

Nenhum comentário: