Map

9 respostas
F

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"));
        
     
    
    }

}

9 Respostas

Rafael_Steil

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

F

Fiz a tua modificacao mas continua nao encontrando!

F
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
F

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

F

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?

Rafael_Steil

Releia o meu codigo com mais atencao :wink:

Rafael

Ironlynx

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

F

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

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){

ViniGodoy

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>();
Criado 25 de dezembro de 2007
Ultima resposta 25 de dez. de 2007
Respostas 9
Participantes 4