Death_Knight 0 Denunciar mensagem Publicado 29 de Janeiro de 2013 (editado) 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 29 de Janeiro de 2013 por thoga31 GeSHi Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 29 de Janeiro de 2013 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 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
ortsac 0 Denunciar mensagem Publicado 30 de Janeiro de 2013 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? Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Death_Knight 0 Denunciar mensagem Publicado 30 de Janeiro de 2013 (editado) 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 30 de Janeiro de 2013 por Death_Knight Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 30 de Janeiro de 2013 não dá para ler o teu código IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
brunoais 67 Denunciar mensagem Publicado 30 de Janeiro de 2013 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 1185 Denunciar mensagem Publicado 30 de Janeiro de 2013 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 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Death_Knight 0 Denunciar mensagem Publicado 30 de Janeiro de 2013 (editado) 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 30 de Janeiro de 2013 por Death_Knight Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
HappyHippyHippo 1185 Denunciar mensagem Publicado 30 de Janeiro de 2013 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 Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites