Death_Knight Posted January 29, 2013 at 11:11 PM Report #493486 Posted January 29, 2013 at 11:11 PM (edited) 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 Edited January 29, 2013 at 11:13 PM by thoga31 GeSHi
HappyHippyHippo Posted January 29, 2013 at 11:41 PM Report #493499 Posted January 29, 2013 at 11:41 PM HashMap <String,String> novo = null; não podes manipular um objecto que não existe ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
ortsac Posted January 30, 2013 at 03:53 AM Report #493514 Posted January 30, 2013 at 03:53 AM Tens que inicializar o HashMap primeiro. O link é da api do java, pode ser que a documentação de ajude. HashMap <String,String> novo = new...; http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.html Outra coisa não te falta um construtor para inicializares as tuas variáveis? Elas não deviam ser privadas ou publicas?
Death_Knight Posted January 30, 2013 at 11:28 AM Author Report #493528 Posted January 30, 2013 at 11:28 AM (edited) 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? Edited January 30, 2013 at 11:32 AM by Death_Knight
HappyHippyHippo Posted January 30, 2013 at 11:46 AM Report #493534 Posted January 30, 2013 at 11:46 AM não dá para ler o teu código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
brunoais Posted January 30, 2013 at 12:53 PM Report #493562 Posted January 30, 2013 at 12:53 PM 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%.
HappyHippyHippo Posted January 30, 2013 at 01:13 PM Report #493566 Posted January 30, 2013 at 01:13 PM 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 Portugol Plus
Death_Knight Posted January 30, 2013 at 01:39 PM Author Report #493571 Posted January 30, 2013 at 01:39 PM (edited) 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 Edited January 30, 2013 at 01:40 PM by Death_Knight
HappyHippyHippo Posted January 30, 2013 at 02:28 PM Report #493578 Posted January 30, 2013 at 02:28 PM 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 Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now