Ajuda sobre melhor hashCode() para armazenar e recupar em uma TreeMap

11 respostas
G

Fala galera!!! Esotu precisando de um ajuda de vcs. (sou novo por aqui, mas já estou me enturmando! heheh)

Tenho uma estrutura de dados feita para armazenar produtos(da classe Produto) e baseada em TreeMap.

Estou querendo encontrar uma forma de gerar um hashcode baseado no código do produto(que seria o código de barras do produto) e na data de inserção(o usuário seta a data), para servir de chave na hora da inserção no TreeMap.
Até aí tudo bem, eu estava conseguindo fazer. Só citei p/ entenderem melhor o problema.
O problema é na hora de de recuperar os dados que foram armazenados, pq eu preciso recuperar utilizando o código do produto(código de barras) como parâmetro para o método. Ex.: treemep.get(códigoProduto). Só que isso não é possível, pois eu armazenei o objeto com achave que foi gerada pelo método hashCode()(que é a junção da data de inserção e o código do produto).
Arecuperação precisa ser feita pelo código do produto, pq será usado um leitor de código de barras para tal.
Estou no aguardo de alguma ajuda. :cry: Por favor me ajudem!!!

11 Respostas

bruno_rg

1 - Você está usando um TreeMap por que quer ordenar esses produtos por algum atributo dele? Se não você pode utilizar um HashMap para armazená-los.
2 - Na hora de inserir seus objetos no hash utilize o código de barras como chave e não o hashCode()
3 - Você não deve usar o método hashCode() para obter a chave de seu objeto. Na verdade este método tem outra funcionalidade.
Leia o artigo http://blog.caelum.com.br/2006/09/04/ensinando-que-e-o-hashcode/

G

Muito obrigado por responder!!! Vamos continuar?

1-Você está usando um TreeMap por que quer ordenar esses produtos por algum atributo dele? Se não você pode utilizar um HashMap para armazená-los.

R= Na verdade eu estava usando TreeMap pq eu lhi em um fórum que ele tem um desempenho melhor, quando a chave é uma String, do que o HashMap, isso é verdade?
Para organizar eu estou usando, não sei nem se está certo, Linked’sList’s coloquei no plural pq tenho vário tipos de produtos e preciso que eles estejam organizador por tipo e em ordem alfabética, então eu uso um LinkedList para cada tipo e cada LinkedList está organizado em ordem alfabética. Essa é a melhor maneira?

2 - Na hora de inserir seus objetos no hash utilize o código de barras como chave e não o hashCode()

R= O HashMap não aceita chaves duplicatas, correto? Pois sim, eu vou, pelo menos eu acredito que em algum momento vai acontecer, precisar cadastrar novamente um produto que foi cadastrado em outra época, digo mesmo produto pq eles vão ter o mesmo código de barras e por tanto teriam a mesma chave no HashMap, só que eles não são iguais pq eles tem nº NF diferentes, mais a chave de cadastro no HashMap precisa ser o código de barras pq na hora de fazer pesquisa eu vou utilizar o código de barras, e eu preciso que esses dois cadastros estejam presentes no “Banco de dados” para posteriores verificações. Foi daí que partiu a idéia de fazer a chave com base no hashCode.

T

TreeMap não usa HashCode; ele supõe que você passou um Comparator para ele (o recomendado), ou que a classe da chave implemente Comparable.

G

thingol, muito obrigado por responder!

Eu falei em hashCode() porque precisava de uma chave que fosse única para cada produto que fosse cadastrado na estrutura de dados (TreeMap ou HashMap). Aí na hora de cadastrar eu chamaria o métodos hashCode do produto(objeto) para setar a chave dele, mais ou menos asssim : cadCodigo.put(obj.hashCode(),obj).

Me tira uma dúvida porque Comparator é melhor do que implementar Comparable?

Ainda estou no aguardo bruno_rg !!!

T

Quando você cria um Comparator, pode usar uma outra ordenação que não a estabelecida pela classe. Digamos que você tivesse uma JTable (por exemplo) e quisesse ordenar por uma outra coluna que não fosse a primeira. Se você apenas implementasse Comparable, você não teria opção; mas se você criar um Comparator para cada coluna, você pode ter opção.

T

Cuidado que “hashCode” não é tão bom assim para implementar uma chave única. Se você quer uma chave única, use um hash criptográfico como o MD5 ou o SHA-1.

G

Muito obrigado por responder!!! Vamos continuar?

1-Você está usando um TreeMap por que quer ordenar esses produtos por algum atributo dele? Se não você pode utilizar um HashMap para armazená-los.

R= Na verdade eu estava usando TreeMap pq eu lhi em um fórum que ele tem um desempenho melhor, quando a chave é uma String, do que o HashMap, isso é verdade?
Para organizar eu estou usando, não sei nem se está certo, Linked’sList’s coloquei no plural pq tenho vário tipos de produtos e preciso que eles estejam organizador por tipo e em ordem alfabética, então eu uso um LinkedList para cada tipo e cada LinkedList está organizado em ordem alfabética. Essa é a melhor maneira?

2 - Na hora de inserir seus objetos no hash utilize o código de barras como chave e não o hashCode()

R= O HashMap não aceita chaves duplicatas, correto? Pois sim, eu vou, pelo menos eu acredito que em algum momento vai acontecer, precisar cadastrar novamente um produto que foi cadastrado em outra época, digo mesmo produto pq eles vão ter o mesmo código de barras e por tanto teriam a mesma chave no HashMap, só que eles não são iguais pq eles tem nº NF diferentes, mais a chave de cadastro no HashMap precisa ser o código de barras pq na hora de fazer pesquisa eu vou utilizar o código de barras, e eu preciso que esses dois cadastros estejam presentes no “Banco de dados” para posteriores verificações. Foi daí que partiu a idéia de fazer a chave com base no hashCode.

T

TreeMap é legal quando você precisa ter uma vista ordenada de seus dados (ou seja, quase sempre).
Mas se você não precisa de uma visão ordenada, então é mais rápido usar um HashMap.
(É claro que eu normalmente recomendo TreeMap em vez de HashMap, mas não é baseado em desempenho, e sim em aplicabilidade ao seu problema. Normalmente você precisa de algo ordenado)

G

O HashMap ou TreeMap não aceita chaves duplicatas, correto? Pois sim, eu vou, pelo menos eu acredito que em algum momento vai acontecer, precisar cadastrar novamente um produto que foi cadastrado em outra época, digo mesmo produto pq eles vão ter o mesmo código de barras e por tanto teriam a mesma chave no HashMap, só que eles não são iguais pq eles tem nº NF diferentes, mais a chave de cadastro no HashMap precisa ser o código de barras pq na hora de fazer pesquisa eu vou utilizar o código de barras, e eu preciso que esses dois cadastros estejam presentes no “Banco de dados” para posteriores verificações. Foi daí que partiu a idéia de fazer a chave com base no hashCode.

Ao tentar cadastrar um produto com o mesmo código de barras(que seria uma chave já existente) ele ficaria armazenado na estrutura?

Vamos supor que eu cadastrei no mês de Janeiro o Alcool Sta. Cruz com código(código de barras) 0 (só pra ficar de acordo com a estrutura) e no mês de Fevereiro Cadastrei novamente o mesmo alcool com mesmo código(código de barras).
Obs.: Eu preciso manter as duas entradas pq elas vão ter alguns atributos diferentes, como: nº NF, data de cadastro…

Imagino que ficaria assim:

|0| —> |L1| |L2| // são objetos diferentes mas tem a mesma chave

T

Você precisa de uma estrutura de dados que aceite chaves duplicadas. Em C++ existe o “multimap” e uma biblioteca muito famosa do C++, o Boost, tem uma super-estrutura de dados chamada “multi-index”.
Já em Java você pode usar o Jakarta Commons Collections (que admito que é um pouco antiga e inadequada), com o “MultiMap”.

http://commons.apache.org/collections/api-release/org/apache/commons/collections/MultiMap.html

G

Muito obrigado thingol!!!

Mas me tira só uma dúvida.

O método de pesquisa(que seria retornar um valor através da chave, que foi dada no ato da inserção do valor na estrutura) oferecido pela MultiMap (get(key), em termos de eficiência, e igual ao do HashMap? ou Melor, usar MultMap para pesquisar um valor é mais eficiente que usar ArrayList? Se ArrayList for melhor vc tem alguma implementação de método de de pesquisa em ArrayList?

Pq vc disse:

"Já em Java você pode usar o Jakarta Commons Collections (que admito que é um pouco antiga e inadequada), com o “MultiMap”. "

Vc poderia dar uma clareada melhor? :slight_smile:

Obrigado?

Criado 30 de agosto de 2008
Ultima resposta 2 de set. de 2008
Respostas 11
Participantes 3