| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:38:19
|
renato_ramos
JavaGuru
![[Avatar]](/images/avatar/c5aa1ea0b5da97a51d83ef18cf9daebe.jpg)
Membro desde: 07/10/2009 12:04:32
Mensagens: 234
Offline
|
Oi!
eu estava fazendo uns exercicios da faculdade pediram para eu gerar o hash da minha classe, como eu não entendi muito bem
eu pedi para o netbeans gerar para mim.
Até td bem ele gerous mas não funcionou.
essa eh minha classe abaixo como eu testei.
alguem me explica pq não funcionou.
muito obrigado =D
|
[]'s Renato Ramos |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:39:42
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
http://www.guj.com.br/posts/list/52485.java#276120
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:40:29
|
Marcos Lima
JavaBaby
Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline
|
O que não funcionou, qual foi o erro?
O código do hashCode() parece bom, está levando em consideração o nome, turno, semestre e matrícula (Se bem que acho que se levasse só a matrícula em consideração seria melhor...)
|
Marcos Lima
SCJP 6.0 (05/2010) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:41:19
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Também é necessário implementar o método equals. Você sempre deve sobrescrever o par, equals e hashcode, para que as collections funcionem de maneira consistente.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:45:32
|
Marcos Lima
JavaBaby
Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline
|
Exatamente, se vc não implementar o equals não vai funcionar.
Tente assim:
E quanto ao hashCode, vc poderia levar em consideração só a matrícula (Não existem dois alunos com a mesma matrícula), então eu faria assim:
Bem mais simples, funcional e de fácil manutenção
This message was edited 2 times. Last update was at 12/02/2010 09:47:48
|
Marcos Lima
SCJP 6.0 (05/2010) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:56:29
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
If com return true ou return false? Lembre-se o if avalia uma expressão booleana. Então, isso é o mesmo que:
Outra coisa, o método equals aceita um Object como parâmetro, não um Aluno. Se fizer com aluno, você estará fazendo a sobrescrita do método, não dará erro e não funcionará.
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:59:32
|
fitoplancton
Thread.start()
![[Avatar]](/images/avatar/e1fc9c082df6cfff8cbcfff2b5a722ef.jpg)
Membro desde: 22/06/2004 14:29:54
Mensagens: 26
Offline
|
Marcos Lima wrote:Exatamente, se vc não implementar o equals não vai funcionar.
Tente assim:
E quanto ao hashCode, vc poderia levar em consideração só a matrícula (Não existem dois alunos com a mesma matrícula), então eu faria assim:
Bem mais simples, funcional e de fácil manutenção 
Você não pode estar falando sério...
|
O fitoplâncton é a base dos ecossistemas aquáticos, pois é por meio da fotossíntese realizada pelas microalgas que a energia entra na cadeia alimentar. As microalgas fitoplanctônicas são em sua grande maioria autotróficas, unicelulares solitárias ou coloniais.
O fitoplâncton pode ser estudado sob o ponto de vista qualitativo, onde os aspectos taxonômicos e de estrutura populacional são enfocados. Os estudos quantitativos do fitoplâncton abordam os padrões de distribuição espacial e temporal e podem ser uma importante ferramenta na avaliação da qualidade de água dos recursos hídricos. As principais divisões do fitoplâncton em águas continentais são: Cyanophyta, Chlorophyta, Euglenophyta, Crysophyta e Pyrrophyta. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 09:59:47
|
Marcos Lima
JavaBaby
Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline
|
Nossa, fui noob com esse if, haha
E quanto ao equals... Certo, é Object e também esqueci desses ifzinhos testando se é null, e tal...
Dá um desconto, hoje é sexta
|
Marcos Lima
SCJP 6.0 (05/2010) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:03:25
|
Marcos Lima
JavaBaby
Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline
|
fitoplancton, no hashCode eu falei sério... Se vc levar em conta todos os campos, vc pode acabar com 2 Alunos com mesma matrícula em cursos diferentes, o que com certeza é um problema. Mas isso se aplicaria ao método equals também. Lembrando que aí é questão de negócio e estrutura do software, e não de desempenho.
|
Marcos Lima
SCJP 6.0 (05/2010) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:19:23
|
renato_ramos
JavaGuru
![[Avatar]](/images/avatar/c5aa1ea0b5da97a51d83ef18cf9daebe.jpg)
Membro desde: 07/10/2009 12:04:32
Mensagens: 234
Offline
|
Opa, desde ja agradeco a atenção
eu tentei
getMatricula().hashCode(); e não afuncionou!
entao eu deixei somente getMatricula();
funcionou!
mas isso foi somente exemplo e tals.. e gostaria de saber por que com as string como parametro do hash não funcionou já que eu coloquei tudo igual.
qnto ao equals(Aluno a); eu implementei mas o netbeans fala para ter um equals(Object obj);
deixei o do Object obj;
obrigado!
|
[]'s Renato Ramos |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:24:29
|
Marcos Lima
JavaBaby
Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline
|
Pelo jeito vc está usando Java 1.4...
Para isso, tente
Usar a própria matrícula como hashCode é uma saída, mas se vc tem muitos Alunos para cadastrar pode haver muita colisão no seu HashSet.
Não funcionou antes porquê:
O hashCode que estava sendo chamado era herdado da classe Object. Se vc observar, ele é nativo e não leva os atributos do objeto herdado em questão (Até pq não teria como, ele não os conhece). Mesmo que todos os atributos sejam iguais, ele não vai retornar o mesmo hashCode, você sempre deve sobrescrevê-lo quando usar como índice para qualquer tabela Hash.
Use o equals sugerido pelo ViniGodoy, eu não estava pensando bem quando falei para usar Aluno como parâmetro
Espero que eu tenha sido claro.
This message was edited 3 times. Last update was at 12/02/2010 10:30:13
|
Marcos Lima
SCJP 6.0 (05/2010) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:27:50
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
renato_ramos wrote:
essa eh minha classe abaixo como eu testei.
alguem me explica pq não funcionou.
muito obrigado =D
Se vc explicar o que significa "não funcionar" ...
O problema não é o seu hash é o seu conceito.
O hash está ok mas vc está colocando dois objetos iguais num Set. O set vai guardar o primeiro.
Quando tentar por o segundo ele vai encontrar um com o mesmo hash. (acontece uma colisão de hash)
Então ele vai usar o equals() para saber se o objeto é o mesmo. ah!, mas vc não implemento o equals, logo o equals padrão vai ser usado.
Este vai dizer que os objetos são diferentes ( pois ele apenas faz == entre eles). E portanto o Set aceita o segundo objeto.
O set tem razão. A sua classe é que está errada
implemente o equals em conformidade com o hashSet.
Agora, o hash não precisa ter todos os campos da classe. Isso representa que vc não sabe o que é e para que serve o hash.
A regra é assim :
1) se x.equals(y) => x.hashCode() == y.hashCode()
2) Se reimplementar equals ou hashCode tem que reimplementar o outro também.
Atendamos a (1) apenas, pois já vimos que o seu problema é não ter respeitado (2)
Vamos pensar que para que os objetos sejam iguais os campos A e B tem que ser iguais em ambos os objetos
Portanto, se A E B têm que ser iguais é verdade que A tem que ser igual, logo se usar o hashcode como A.hashCode vc está garantindo (1) e o hash estará bem implementado.
Alguem ai sugeriu usar apenas matricula.hashCode, isso está correto sim.
Mas porque escolher A em vez de B para ser usado no hash? Vc deve escolher aquele que tiver probabilidade maior de ser diferente. A matricula é o que tem maior probabilidade porque: ha muitos alunos num turno e semestre e é possivel ter pessoas com o mesmo nome.
Na construção do equals o campo que tiver mais probabilidade de ser diferente tb deve vir primeiro.
Já agora , nunca , nunca, nunca, (...) , nunca , nunca façam um if/else que retorna boleano
Isto
Se substitui por :
This message was edited 1 time. Last update was at 12/02/2010 10:42:54
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:29:07
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
O hashCode do Integer é o próprio int que ele contém. Então:
new Integer(getMatricula()).hashCode() é equivalente a só getMatricula().
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:32:21
|
Marcos Lima
JavaBaby
Membro desde: 11/02/2010 08:48:51
Mensagens: 78
Localização: Curitiba - PR
Offline
|
Puts, ViniGodoy, vc está me destruindo...
Acho que vou ler um livro, hahaha...
|
Marcos Lima
SCJP 6.0 (05/2010) |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/02/2010 10:34:37
|
Felagund
GUJ Master
![[Avatar]](/images/avatar/d8d855c465198499868fb2b566ebee8d.jpg)
Membro desde: 26/07/2006 11:51:36
Mensagens: 1732
Localização: Santa e Bela Catarina
Offline
|
sergiotaborda wrote:
Já agora , nunca , nunca, nunca, (...) , nunca , nunca façam um if/else que retorna boleano
Isto
Se substitui por :
Vejo algum null pointer a caminho em qualquer uma dessa condições
|
att
Rafael Felix
Rolling With Code
Twitter |
|
|
 |
|
|