Ordenação de um HashMap

9 respostas
sumihara

Fala Pessoal!

Preciso de uma ajuda.

Como eu posso ordernar um HashMap pelo valor do objeto e não pela chave?

Segue o código que eu estou utilizando.

HashMap Lista = new HashMap(); 
Lista.put(campoRG.getText(), func);

Como eu posso ordernar pelo func?

Valeu!

9 Respostas

T

HashMaps não podem ser ordenados; copie o valor do HashMap para um TreeMap.
Além disso, como você quer ordenar pelo valor e não pela chave, você tem de “inverter” o Map - estou supondo que não há valores repetidos.

sumihara

Ok, obrigado!!

sergiotaborda

sumihara:
Fala Pessoal!

Preciso de uma ajuda.

Como eu posso ordernar um HashMap pelo valor do objeto e não pela chave?

Vc não pode. Nem com HashMap, nem com TreeMap( que ordena a chave).

Cloque os valores em um List e ordene o list.

sumihara

hummm…

eu consigo colocar um hashmap dentro de um List?

fabim

sumihara:
hummm…

eu consigo colocar um hashmap dentro de um List?

Ate pode, mas nao teria efeito pro que vc quer (ordenar).

Vc pode é colocar esses objetos dentro de um List, ao inves de um Map. E entao ordena-lo, de varias maneiras diferentes.

Caso esses objetos sejam algo como String, ou Integer, um Collections.sort( suaLista ) ja resolveria. (Pois usaria a ordenacao natural)
No caso de vc ter por exemplo varios objetos Carro na lista, e quisesse ordenar pela placa do carro, poderia usar um Comparator pra isso.

sergiotaborda
sumihara:
hummm...

eu consigo colocar um hashmap dentro de um List?

Sim, mas nao é isso que vc quer. Vc quer colocar os valores no list

List listaValores  = new ArrayList(hashmap.values());
Collections.sort(listaValores  );

// listaValores  está ordenada (supondo que os objetos dentro dela são ordenáveis)
Andre_Brito

Cara, eu passei pelo mesmo problema quando implementei o Algoritmo de Kruskal.
Eu fiquei praticamente a manhã toda procurando, até que chegou na hora do almoço e me enervei. Apesar de ser a maneira mais custosa, eu armazenei em duas listas (uma para a chave e outra para o value) e ordendei. Depois, criava um novo HashMap e inseria os elementos ordenados. Eu sei, é caro (no sentido de complexidade espacial), mas eu não vi jeito melhor de fazer.
Tanto que eu fiquei com a consciência pesada (porque achei que ia custar demais, dependendo da entrada) que tirei o HashMap e usei duas listas mesmo.

[editado]
Ah, só pra constar, eu não usei o sort de Collections porque precisava mexer as chaves nas mesmas proporções dos values.
Vou dar uma procurada no HD. Se eu achar, eu posto aqui.
[/editado]

sergiotaborda

Tudo depende de para quê vc quer ordenar os valores.
Se a ideia é apenas ter a mesma ordem de inserção , use LinkedHashMap.
Agora , se a ideia é poder obter o valor por uma chave e mesmo assim manter a lista de valores ordenada
use um HashMap e um List. Crie um objeto - HashListMap que contem ambos com uma interface como a do Map.
quando vc der o put, coloque o objeto no map e no list. Lembre-se que o java não copiará o objeto então não ha 'mais peso" em suar os dois collections juntos.

Uma outra opção, que seria a eu usaria se precisasse fazer isso, seria criar uma chave especial que mantem uma referencia ai valor.
Essa chave é ordenável pelo valor (comparator) mas casada pelo equals. Ai usa um TreeMap onde o hashcode é irrelevante.
Dá uma poucquinho de trabalho mas pode usar o TreeMap padrão e fazer a sua propria chave não é assim tão dificil.
O TreeMap manterá as chaves ordenadas, mas como a ordem delas é a mesma que a dos valores, os valores tb estarão ordenados.

sumihara

Fala Pessoa!!

Valeu pela ajuda… vou realizar alguns testes aqui!

Obrigado!

Criado 16 de outubro de 2008
Ultima resposta 17 de out. de 2008
Respostas 9
Participantes 5