Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Death_Knight

Ajuda com HashMaps

Mensagens Recomendadas

Death_Knight

Boas,

Estou aqui com um problema que não estou a conseguir resolver, a minha intenção ér ter um HashMap duplo que sirva de dicionário para diversas línguas, por exemplo se fizer Dicionario.add("portugues","HELLO","ola"); terei como chaves o "portugues" e o "HELLO" e o valor lá guardado seria a string "ola", o código que tenho é o seguinte:


public class Dicionario {

      HashMap <String, HashMap <String,String> > mapa;

      String chave = null;

   void add(String lingua, String indice, String palavra) {


      HashMap <String,String> novo = null;
      novo.put(indice, palavra);

      mapa.put(lingua,novo);

   }

   void defineLingua(String lingua) {
       this.chave=lingua;
   }

   public String get(String pesquisar)
   {
       String palavra=null;
       HashMap <String,String> procurar;
       procurar=mapa.get(chave);

       palavra=procurar.get(pesquisar);

       return palavra;
   }

}

O código está bastante simples e pela minha lógica deveria funcionar, no entanto por alguma razão que não entendo está a dar erro no método add, alguém me sabe dizer o que lá estou a fazer mal?

Cumprimentos

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Death_Knight

Realmente o meu problema era mesmo só de estar a fazer isto á noite cansado e não vi que não tinha inicializado as variáveis decentemente, muito obrigado aos dois, no entanto agora surgiu-me outra coisa que eu não "esperava", tenho isto:


public class Dicionario {

   private HashMap <String, HashMap <String,String> > mapa ;
   private String chave;

   Dicionario(){
	   mapa = new HashMap();
	   chave = new String();
   }
   void add(String lingua, String indice, String palavra) {


		HashMap <String,String> novo = new HashMap();
		//System.out.print("adicionar " + indice + " " + palavra + "\n");
		novo.put(indice, palavra);

		//System.out.print("adicionar " + lingua + " " + novo.toString() + "\n");
		mapa.put(lingua,novo);

	}

		void defineLingua(String lingua) {
		this.chave=lingua;
		//System.out.print("para a lingua " + lingua + " existem: " + mapa.get(lingua).toString());
	}

	public String get(String pesquisar)
	{
		String palavra;
		HashMap <String,String> procurar;
		procurar=mapa.get(chave);

		palavra=procurar.get(pesquisar);

		return palavra;
	}

}

e por exemplo com esta main:

public static void main(String [] args){

	Dicionario d=new Dicionario();

	d.add("ingles","LIVRO","Book");
	d.add("frances","LIVRO","livre");
	d.add("portugues","LIVRO","livro");
	d.add("ingles","ANO","year");
	d.add("frances","ANO","an");
	d.add("portugues","ANO","ano");


	d.defineLingua("ingles");
	System.out.println(d.get("ANO")); //year
	d.defineLingua("portugues");
	System.out.println(d.get("ANO"));//ano
	d.defineLingua("frances");
	System.out.println(d.get("LIVRO"));//livre


}

O objectivo dos dois HashMaps seria por exemplo com a chave de lingua e com a chave da palavra ir buscar a tradução, no entanto ele está a sobrepor as linguas (chaves iguais, consigo aceder aos "ANO" mas não aos "LIVRO") será que consigo resolver isto com os dois HashMaps que tenho ou necessito estruturas de dados auxiliares?

Editado por Death_Knight

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
brunoais

Isso compila sem warnings?


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

nas maps, a chave é única, por isso nunca terás os dados que estás a usar

por outras palavras : tens de mudar completamente como estás a fazer


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Death_Knight

Isso compila sem warnings?

Compila sem qualquer warning

nas maps, a chave é única, por isso nunca terás os dados que estás a usar

por outras palavras : tens de mudar completamente como estás a fazer

Então por exemplo como me aconselhas a colocar chaves "compostas por duas" ?

Exemplo:

A classe dicionário que estou a desenvolver armazena 3 Strings para cada palavra a pesquisar

Uma String da língua

Uma String da palavra em Inglês

Se tiver a palavra "adeus" a ideia era na classe ter como chaves (adicionadas nesse meu método add) "Português" e "Goodbye" representando por HashMaps a ideia original era:

HashMap <Chave1 (A lingua), HashMap <Chave Secundária (a palavra em Inglês), "Adeus" (ou a palavra a ser pesquisada pelo uso das duas chaves anteriores) > >

Espero ter-me explicado bem

Editado por Death_Knight

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

nop, seria melhor:

public class Dicionario
{
 protected Key
 {
   protected String lang;
   protected String handle;

   public Key(string lang, string handle)
   {
     this.lang = lang;
     this.handle = handle;
   }

   public getLang() { return this.lang; }
   public getHandle() { return this.handle; }

   public boolean equals(Object obj)
   {
     if ( this == obj ) return true;            // self-compare
     if ( !(obj instanceof Key) ) return false; // type check

     Key key = (Key)obj;
     return this.lang.compareTo(key.lang) == 0 && this.handle.compareTo(key.handle) == 0;
   }
 }

 protected HashMap<Key, String> list;

 public add(String lang, String handle, String entry)
 {
   list.put(Key(lang, handle), entry);
 }
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.