Você está instanciando o Map no construtor da classe ListaDeUsuarios. Logo, toda vez que tu cria um objeto do tipo ListaDeUsuarios, ele cria uma nova instância de HashMap (classe que implementa a interface Map), portanto sem dados. Como tu está chamando esses métodos?
Obs.: prefira nomes no singular para classe. Em vez de ListaDeUsuarios, poderia ser ListagemDeUsuario.
Alysson_Alves1
na vdd eu coloquei no construtor na esperança de resolver, originalmente ele estava em uma linha só, sem construtor.
eu chamo através de um método de outra classe login, mas já fiz vários testes na própria classe, veja que a cada passo tô checando com está o map de novo, com um println.
importjava.util.Map;importjava.util.HashMap;publicclassListagem{privateMap<String,Usuario>mapeamento=newHashMap<>();publicbooleanadicionarUsuario(Stringchave,Usuariousuario){System.out.println("Chave: "+chave);if(!mapeamento.containsKey(chave)){mapeamento.put(chave,usuario);System.out.println("-> "+mapeamento.get(chave).getNomeUsuario());if(mapeamento.containsKey(chave)){System.out.println("Usuário registrado: "+mapeamento.get(chave).getNomeUsuario());returntrue;}}elseSystem.out.println("Usuário já está registrado!");returnfalse;}publicbooleanconsultarMapa(Stringchave,Usuariousuario){if(mapeamento.containsKey(chave)){if(usuario.getSenha().equals(mapeamento.get(chave).getSenha()))returntrue;elsereturnfalse;}elseSystem.out.println("Chave "+chave+" não cadastrada!");returnfalse;}}
publicstaticvoidmain(String[]args){ListaDeUsuarioslis=newListaDeUsuarios();Scannerler=newScanner(System.in);Loginl=newLogin();Cadastrarc=newCadastrar();System.out.println("Escolha um login");StringL=ler.next();System.out.println("Escolha uma senha");StringS=ler.next();c.cadastro(L,S);while(!L.equalsIgnoreCase("cancelar")){System.out.print("Login: ");L=ler.next();System.out.print("Senha: ");S=ler.next();l.entrar(L,S);}}}
cadastra
importjava.util.*;publicclassApp{publicstaticvoidmain(String[]args){ListaDeUsuarioslis=newListaDeUsuarios();Scannerler=newScanner(System.in);Loginl=newLogin();Cadastrarc=newCadastrar();System.out.println("Escolha um login");StringL=ler.next();System.out.println("Escolha uma senha");StringS=ler.next();c.cadastro(L,S);while(!L.equalsIgnoreCase("cancelar")){System.out.print("Login: ");L=ler.next();System.out.print("Senha: ");S=ler.next();l.entrar(L,S);}}}
login
publicclassLogin{publicvoidentrar(StringL,StringS){ListaDeUsuarioslis=newListaDeUsuarios();// Usuario us=new Usuario("Alysson","1234");if(lis.consultaLista(L,S)){System.out.print("Login com sucesso "+lis.consultaLista(L,S));}else{System.out.println("errado "+lis.consultaLista(L,S));};}}
Lista
importjava.util.*;publicclassListaDeUsuarios{Map<String,Usuario>map=newHashMap<String,Usuario>();publicbooleanadiciona(Stringl,Usuarious){if(!map.containsKey(l)){map.put(l,us);if(map.containsKey(l)){System.out.println("Usuário Registrado"+map);}returntrue;}else{System.out.println("Esse usuário já existe!");returnfalse;}}publicbooleanconsultaLista(StringL,StringS){if(map.containsKey(L)){// Usuario A=map.get(L);if(S.contentEquals(map.get(L).getSenha())){returntrue;}else{returnfalse;}}else{System.out.print(map+""+map.get(L));returnfalse;}}}
1 - No main: lis;
2 - Na classe Cadastrar;
3 - No método entrar da classe Login: lis.
Cada novo objeto do tipo ListaDeUsuarios cria um novo mapa, já que:
Java version: 1.8.0_251.
I
Iohannes
Chamadas com um mesmo objeto:
Se eu adicionar um dos usuários com um outro objeto, suponhamos, listagem2:
Alysson_Alves1
mas no caso não estou fazendo referência nenhuma ao Map em questão, e sim a classe ListaDeUsuarios, da pra notar isso com o println(map); que tem no caso de não achar o objeto no Map,
através do lis, eu consigo acesso a classe ListaDeUsuarios, que por sua vez da acesso ao método consultaLista() , que me notifica se o conteúdo está presente no map, me mostrando o map, que está vazio como se fosse outro map, mesmo fazendo refenrência a um Map instânciado na classe. Eu cheguei cogitar que o metodo adiciona não está adicionando, por isso coloquei um println() toda vez que é registrado um novo objeto, mesmo adicionando.
Eu tbm pedi pra ele checar se o a chave está na lista, ele checa e está, mas se eu checar em outro método, é como se nada tivesse sido alterado.
I
Solucao aceita
Iohannes
Mas cabe a classe ListaDeUsuarios criar uma instância de Map.
Exemplo: listaDeUsuario1 -> cria uma instância de de Map, por exemplo map1. se tu colocar algum dado, ficará em map1.
listaDeUsuario2-> cria a instância map2. Se adicionar algum dado, ficará em map2.
listaDeUsuario3 -> ao fazer a consulta, será no objeto map3 que está vazio.
Você pode tornar essa variável que é de instância (uma para cada objeto) se tornar uma variável de classe (uma para qualquer objeto) tornando-a estática:
já tinha outros projetos que eu havia tentado criar e alterar listas e dava esse mesmo problema, nunca suspeitei
I
Iohannes
Veja, mesmo eu usando dois objetos, como no exemplo anterior, mas agora o map como variável de instância:
Para você confirmar:
publicclassMapping{publicstaticvoidmain(String[]args){booleanstatus;String[]chaves;Listagemlistagem=newListagem();//Objeto 1Listagemlistagem2=newListagem();//Objeto 2Usuariousuario1=newUsuario();usuario1.setId(2253L);usuario1.setNomeUsuario("Fulano");usuario1.setSenha("Ful@n0");Usuariousuario2=newUsuario();usuario2.setId(1860L);usuario2.setNomeUsuario("Beltrano");usuario2.setSenha("B3ltr4n0");Usuariousuario3=newUsuario();usuario3.setId(480L);usuario3.setNomeUsuario("Sicrano");usuario3.setSenha("$1cr@n0");chaves=newString[2];chaves[0]="user1";chaves[1]="user1860";listagem2.adicionarUsuario("user1860",usuario2);//objeto 2 sendo usadostatus=listagem.adicionarUsuario("user1",usuario1);//objeto 1 sendo usadoif(status)System.out.println("Sim! [inserção]");elseSystem.out.println("Não! [inserção]");status=listagem.consultarMapa("user01",usuario1);//objeto 1 sendo usadoif(status)System.out.println("Sim![chave: user01]");elseSystem.out.println("Não! [chave: user01]");status=listagem.consultarMapa("user1",usuario1);//objeto 1 sendo usadoif(status)System.out.println("Sim! [chave: user1]");elseSystem.out.println("Não! [chave: user1]");listagem.mostrarUsuarios(chaves);}}
Mas…
importjava.util.Map;importjava.util.HashMap;publicclassListagem{privatestaticMap<String,Usuario>mapeamento=newHashMap<>();publicbooleanadicionarUsuario(Stringchave,Usuariousuario){System.out.println("Chave: "+chave);if(!mapeamento.containsKey(chave)){mapeamento.put(chave,usuario);System.out.println("-> "+mapeamento.get(chave).getNomeUsuario());if(mapeamento.containsKey(chave)){System.out.println("Usuário registrado: "+mapeamento.get(chave).getNomeUsuario());returntrue;}}elseSystem.out.println("Usuário já está registrado!");returnfalse;}publicbooleanconsultarMapa(Stringchave,Usuariousuario){if(mapeamento.containsKey(chave)){if(usuario.getSenha().equals(mapeamento.get(chave).getSenha()))returntrue;elsereturnfalse;}elseSystem.out.println("Chave "+chave+" não cadastrada!");returnfalse;}publicvoidmostrarUsuarios(String[]chaves){for(inti=0;i<mapeamento.size();i++){System.out.println("\nID: "+mapeamento.get(chaves[i]).getId()+" Nome de usuario: "+mapeamento.get(chaves[i]).getNomeUsuario());}}}
Leu o post? É bem esclarecedor… O melhor mesmo é usar o padrão Singleton como ele indicou lá.
Alysson_Alves1
sim, inclusive eu não sabia que era possivel ter duas classes em um .java, mesmo como condição que apenas uma seja pública
vou ver sim, mt obrigado, resolvido esse problema, agr posso passar pro próximo desafio. “Vem ai, Java.io…”.
staroski
Seu problema estava no fato de que em cada classe você estava criando um novo objeto da classe ListaDeUsuarios, sendo que em cada uma das classes você deveria estar manipulando o mesmo objeto e não criar um novo.
Pelo jeitão das suas dúvidas, acredito que ainda não lhe está claro a diferença entre classe e objeto.