Map

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

Fiz a tua modificacao mas continua nao encontrando!

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

[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!!

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 :wink:

Rafael

Veja os parênteses na segunda comparação!!!

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:

  1. Na primeira comparação, ele escreve “achei valor”. E é isso que tem que escrever.

  2. 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>();