fabioEM
Dezembro 25, 2007, 1:06pm
#1
ola galera alguem sabe pq nao consigo recuper um objecto desta forma:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
class Animal{
String nome;
public Animal(String nome){
this.nome=nome;
}
Animal(){
}
public boolean equals(Object one){
if( (one instanceof Animal)&&((Animal)one).nome == nome){
return true;
}else return false;
}
public int HashCode(){
return nome.length();
}
}
class Dog extends Animal{}
class Cat extends Animal{}
public class Main {
public static void main(String[] args) {
Map<Object,Object>mapa=new HashMap<Object,Object>();
Animal a=new Animal("Animal");
mapa.put(a,"valor");
System.out.println(" achei "+mapa.get(a));
System.out.println(" achei novamente "+mapa.get(a.nome="Animal"));
}
}
O seu equals() esta errado. Ao inves de
if( (one instanceof Animal)&&((Animal)one).nome == nome){
Faca
if( (one instanceof Animal)&&((Animal)one).nome.equals(nome)){
Seria interessante tambem verificar se “nome” nao eh null antes de chamar equals.
Rafael
fabioEM
Dezembro 25, 2007, 1:32pm
#3
Fiz a tua modificacao mas continua nao encontrando!
fabioEM
Dezembro 25, 2007, 1:40pm
#4
Realmente Rafael Steil acho que nao entendi,pois nao deveria dar certo??Uma vez que passa no texte equals e retorna true e mais uma duvida
porque
tambem se fizer
Animal a2=new Animal(“Animal”);
System.out.println(" achei novamente "+mapa.get(a2));//null
//f( (one instanceof Animal)&&((Animal)one).nome.equals(nome)){
//true // aqui tambem é true
public int HashCode(){ //mesmo tamanho para ambos
return nome.length();
}
o correcto nao seria encontrar o valor atraves da mesma chave!?
obrigado pela atencao
fabioEM
Dezembro 25, 2007, 1:51pm
#5
[quote=fabioEM]
ok Rafael Steil da certo se fizer assim tava errada a sequencia de parentese!!
if( (one instanceof Animal)&&(((Animal)one).nome == nome)){
}
valeu!!
fabioEM
Dezembro 25, 2007, 1:54pm
#6
mas qual a diferenca nao entendi!!
if( (one instanceof Animal)&&(((Animal)one).nome == nome))
e este
if( (one instanceof Animal)&&((Animal)one).nome == nome){
nao é para dar no mesmo?
Releia o meu codigo com mais atencao
Rafael
Veja os parênteses na segunda comparação!!!
fabioEM
Dezembro 25, 2007, 5:15pm
#9
Veja os parênteses na segunda comparação!!! [/quote]
mas de ambos os lados retorna true,ou nao?nao consigo perceber aonde a ordem altera o resultado
f( (one instanceof Animal)&&(((Animal)one).nome == nome))//pelo que entendi primeiramente faz aqui a conversao e depois para o istanceof é isso?
e este
if( (one instanceof Animal)&&((Animal)one).nome == nome){
Rodei o programa aqui e, após alterar o equals funciona perfeitamente:
Na primeira comparação, ele escreve “achei valor”. E é isso que tem que escrever.
Na segunda comparação, ele busca o string “Animal”. Esse string não está cadastrado com no seu mapa. A chave do seu mapa é um Animal, não um String.
Uma dica. Seja mais explícito na criação do seu mapa. Se ele mapeia Animal para String, porque não declara-lo assim?
Map<Animal,String>mapa=new HashMap<Animal,String>();