Como utilizar um dado de um ArrayList em outra classe?
14 respostasResolvido
listjavaarraylist
R
Rafaael
Estou desenvolvendo um programa de reserva de hotel e um dos requisitos é calcular a capacidade de pessoas para um determinado quarto, pessoas com menos de 2 anos não contam na hora da reserva.
Tenho minha classe principal, classe de hospede e da reserva. Eu criei o arraylist na minha classe main e atribui os valores e eu preciso recuperar esse valores na classe reserva para desenvolver o método, segue o código para vocês avaliarem.
Pra testar todos os hóspedes, basta fazer um for no List.
Era essa a dúvida?
Abraço.
L
Lucas_Camara
Então uma reserva é criada a partir de N hóspedes, certo? Pensando na orientação objetos, vc precisa dos hóspedes para construir uma reserva, então vc pode ter um construtor na classe Reserva que irá receber a lista de hóspedes, ou vc pode ter um método, por exemplo, iniciar (de iniciar reserva) na classe Reserva que receba a lista de hóspedes e faça a validação:
publicclassReserva{// propriedades da reservapublicReserva(List<Hospede>hospedes){validar(hospedes);}privatebooleanvalidar(List<Hospede>hospedes)throwsValidacaoReservaException{// faça as validações e vc pode lançar uma exceção caso não passe em alguma validação}}
No exemplo, a classe ValidacaoReservaException é uma exceção customizada que herda de Exception apenas para deixar claro a validação.
E para usar:
publicclassPrincipal{publicstaticvoidmain(String[]args){List<Hospede>hospedes=// cria a lista de hospedes// Tenta criar a resevatry{Reservareserva=newReserva(hospedes);salvar(reserva);}catch(ValidacaoReservaExceptione){System.out.println("Não foi possível criar a reserva: "+e.getMessage());}}}
R
Rafaael
Utilizando dessa forma como eu poderia utilizar os dados da idade? Por exemplo eu preciso criar um método para gerenciar a capacidade do quarto, na reserva o número de pessoas não pode ultrapassar a capacidade do quarto, criança de dois anos ou menos não conta na capacidade, pensei em usar um if, mas não sei como pegar os valores (no caso a idade) do ArrayList da classe Principal e trabalhar com ele na classe Reserva.
Estou começando ainda na programação Java , desde já agradeço você pela ajuda
R
Rafaael
Lucas confesso que fiquei meio perdido na sua explicação, ainda estou começando na programação Java, dentro do método que você explicou eu conseguiria fazer a tratativa da capacidade? Porque assim eu preciso gerenciar a capacidade do quarto e tem a questão da idade, crianças de 2 anos ou menos não conta má capacidade do quarto, pensei em usar um if no meu método, mas não sei como fazer isso kkkk, pode ser que nem seja a forma de tratar também
L
Solucao aceita
Lucas_Camara
Elaborei um pouco mais o exemplo:
importjava.util.ArrayList;importjava.util.List;publicclassMain{publicstaticvoidmain(Stringargs[]){QuartoquartoSimples=newQuarto("Simples",1);List<Hospede>hospedes=newArrayList<>();hospedes.add(newHospede("Fulano",17));try{Reservareserva=newReserva(quartoSimples,hospedes);salvar(reserva);}catch(ValidacaoReservaExceptione){System.err.println("Não foi possível criar a reserva: "+e.getMessage());}}privatestaticvoidsalvar(Reservareserva){System.out.println("Reserva criada com sucesso: "+reserva);}}
publicclassReserva{privatefinalQuartoquarto;privatefinalList<Hospede>hospedes;publicReserva(Quartoquarto,List<Hospede>hospedes)throwsValidacaoReservaException{this.quarto=quarto;this.hospedes=hospedes;validar();}privatevoidvalidar()throwsValidacaoReservaException{// inventei essas regras para exemplificar: // > Para quartos com capacidade igual à 1:// - deve ser apenas 1 hóspede para a reserva e// - o hóspede deve ser maior idade (maior que 18 anos)if(quarto.getCapacidade()==1){if(hospedes.size()>1){thrownewValidacaoReservaException("Para quartos com capacidade igual à 1, a reserva deve ter apenas 1 hóspede.");}for(Hospedehospede:hospedes){if(hospede.getIdade()<18){thrownewValidacaoReservaException("Para quartos com capacidade igual à 1, o hóspede deve ser maior de idade.");}}}}@OverridepublicStringtoString(){return"Reserva ["+quarto+", hospedes="+hospedes+"]";}}
A ideia é deixar a responsabilidade de validar a reserva na própria classe Reserva. Isso deixa a classe mais inteligente e as validações centralizadas onde mais interessa. E, lembrando, que essa é apenas uma forma de fazer.
R
Rafaael
Muito obrigado Lucas você é 10. Outra coisa se não for incomodo, porque nessa parte você escreveu diferente das outras classes?
E eu tenho que calcular a capacidade, se a pessoa tiver 2 anos ou menos não soma na capacidade, vi seu exemplo e pensei em fazer assim, mas não deu muito certo kkk tenho que estudar essa estrutura
Apenas coloquei toString nas classes para aparecer alguma informação útil no console no método salvar (apenas para o exemplo mesmo).
Esse cálculo seria para verificar se a capacidade do quarto atende a quantidade de hóspedes considerando a idade certo?
Nesse caso, vc poderia filtrar a lista de hóspedes antes e, só então, verificar com a capacidade do quarto. Veja:
Alteração na classe Hospede:
publicclassHospede{privatefinalStringnome;privatefinalintidade;publicHospede(Stringnome,intidade){this.nome=nome;this.idade=idade;}/* * Verifica se hóspede afeta a capacidade do quarto pela idade */publicbooleanisAfetaCapacidadeQuarto(){returnidade>=2;}publicStringgetNome(){returnnome;}publicintgetIdade(){returnidade;}@OverridepublicStringtoString(){return"nome="+nome+", idade="+idade;}}
e para verificar a capacidade:
List<Hospede>hospedesCalculoCapacidade=hospedes.stream().filter(h->h.isAfetaCapacidadeQuarto()).collect(Collectors.toList());if(hospedesCalculoCapacidade.size()>quarto.getCapacidade()){thrownewValidacaoReservaException("Há mais hóspedes do que a capacidade permitida para o quarto \"" + quarto.getDescricao() + "\"");}
R
Rafaael
Obrigado pelo apoio Lucas, eu tentei aqui mas ele não está atendendo essa validação, tá passando direto pra de capacidade, e eu coloquei primeiro essa condição de menor de 2 anos
(Não sei se isso interfere kkk)
L
Lucas_Camara
Posta a classe completa que está com as validaçoes pra gente ver.
R
Rafaael
importjava.util.List;importjava.util.stream.Collectors;publicclassReserva{privatefinalQuartoquarto;privatefinalList<Hospede>hospedes;publicReserva(Quartoquarto,List<Hospede>hospedes)throwsValidacaoReservaException{this.quarto=quarto;this.hospedes=hospedes;validar();}privatevoidvalidar()throwsValidacaoReservaException{List<Hospede>hospedesCalculoCapacidade=hospedes.stream().filter(h->h.isAfetaCapacidadeQuarto()).collect(Collectors.toList());if(hospedesCalculoCapacidade.size()>quarto.getCapacidade()){thrownewValidacaoReservaException("Há mais hóspedes do que a capacidade permitida para o quarto \""+quarto.getDescricao()+"\"");}if(quarto.getCapacidade()==1){if(hospedes.size()>1){thrownewValidacaoReservaException("Para quartos com capacidade igual à 1, a reserva deve ter apenas 1 hóspede.");}for(Hospedehospede:hospedes){if(hospede.getIdadeResp()<18){thrownewValidacaoReservaException("Para fazer a reserva, precisa de um hospede responsável maior de 18 anos.");}}}}@OverridepublicStringtoString(){return"Reserva ["+quarto+", hospedes="+hospedes+"]";}}
L
Lucas_Camara
Mas nessa classe nao tem validacao para menores de 2 anos.
R
Rafaael
É nesse caso que eu queria ver, esse filtro de lista é novo e estou tentando entender, basicamente ele percorre toda a lista verificando a idade, ai ele chama o isAfetarCapacidade que está na classe Hospede, esse método retorna que idade >2 afeta na contagem da capacidade, seria isso?