Olá!
Alguém estaria interessado em ajudar um pobre iniciante em Java, fazendo o projeto final da disciplina dele? Posso mandar a especificação completa do mesmo. Tem q ficar pronto em 2 semanas!!!
Senão, me ajudem a saber porque o método validaCodigo não funciona corretamente? São duas Classes "físicas":
importjava.util.Scanner;importjava.util.Vector;publicclassHospital{publicstaticvoidmain(String[]args){Scannerler=newScanner(System.in);Vectorvetor=newVector();Integeropc;do{System.out.println("Digite a opção:\n1- Cadastrar\n2- Alterar\n0- Sair");opc=ler.nextInt();if(opc==1)vetor=cadastraArea();if(opc==2)alteraArea(vetor);}while(opc!=0);}publicstaticVectorcadastraArea(){Scannerler=newScanner(System.in);Integercodigo,opcao;Stringnome,descricao;VectorvetorArea=newVector();do{Areaarea=newArea();System.out.println("Digite o código da área: ");codigo=validaCodigo(vetorArea);area.setCodigo(codigo);System.out.println("Digite o nome da área de código "+codigo+": ");nome=validaNome(vetorArea);area.setNome(nome);System.out.println("Digite uma descrição para "+nome+": ");descricao=validaDescricao(vetorArea);area.setDescricao(descricao);vetorArea.add(area);System.out.println("Deseja cadastrar mais uma área? 1- Sim 2- Não");opcao=ler.nextInt();}while(opcao==1);returnvetorArea;}publicstaticvoidalteraArea(Vectorvt){Scannerler=newScanner(System.in);Integeropcao,codArea;StringnovoNome;System.out.println("O que deseja alterar? 1- Nome 2- Descrição");opcao=ler.nextInt();switch(opcao){case1:{System.out.println("Digite o código da área que deseja alterar: ");codArea=ler.nextInt();ler.nextLine();for(intaux=0;aux<vt.size();aux++){Areaareas=(Area)vt.get(aux);if(areas.getCodigo()==codArea){System.out.println("Area: "+areas.getNome());System.out.println("Descrição: "+areas.getDescricao());System.out.println("Digite o novo nome: ");novoNome=ler.nextLine();areas.setNome(novoNome);vt.add(areas);break;}}}}}publicstaticIntegervalidaCodigo(VectorvtArea){Scannerler=newScanner(System.in);Integercod=ler.nextInt();for(intaux=0;aux<vtArea.size();aux++){Areaareas=(Area)vtArea.get(aux);while(cod==areas.getCodigo()){System.out.println("Este código já existe. Escolha outro: ");cod=ler.nextInt();}}returncod;}publicstaticStringvalidaNome(VectorvtArea){Scannerler=newScanner(System.in);Stringnom=ler.nextLine();for(intaux=0;aux<vtArea.size();aux++){Areaareas=(Area)vtArea.get(aux);while(nom.equalsIgnoreCase(areas.getNome())){System.out.println("Inválido. Digite novamente: ");nom=ler.nextLine();}}returnnom;}publicstaticStringvalidaDescricao(VectorvtArea){Scannerler=newScanner(System.in);Stringdescr=ler.nextLine();returndescr;}}
O problema está nesse trecho. Comparação de dois Objetos não é feito dessa forma. Se sua variável ‘cod’ e o ‘getCodigo()’ retornasse um primitivo ‘int’ daria certo dessa forma.
Tente:
while(cod.equals(areas.getCodigo())){
.
.
.
S
shintalg
Muito obrigado pela rápida resposta adrian.gois!
Resolveu uma parte do problema. A outra parte é que tem aquele menuzinho no início neh?! A validação está funcionando apenas na primeira vez que entro na opção “cadastrar”. Se dentro de Cadastrar eu optar por não cadastrar mais, e ao voltar ao menu eu escolher novamente cadastrar aí a validação já não funciona para os códigos criados no primeiro cadastramento. Isso, claro, sem encerrar o programa. Apenas usando as opções em execução. Isso tb não to entendendo bem pq acontece…
programadormaia
Fala Rapaziada!!!
Amigo… vc esta enviando um argumento Vector vazio para o metodo validaCodigo.
Quando você usa o metodo vtArea.size() para recuperar o tamanho do vetor, ele retorna 0, e não entra no for.
Não sei muito bem o propósito da classe, e não testei, mais creio que esse seja um problema.
Abs
Victor Maia
S
shintalg
Boa tarde programadormaia! Não creio ser um problema. Se um Vector é enviado vazio, não precisa entrar no for pois não tem um valor anterior para validar. Na segunda vez que ele for enviado, o for vai entrar em ação e vai comparar com o zero, já que agora ele é 1. Eu penso que seja assim, mas vou fazer testes pensando no que você falou. Obrigado!
adrian.gois
publicstaticVectorcadastraArea(){Scannerler=newScanner(System.in);Integercodigo,opcao;Stringnome,descricao;VectorvetorArea=newVector();do{Areaarea=newArea();System.out.println("Digite o código da área: ");codigo=validaCodigo(vetorArea);area.setCodigo(codigo);...
O problema é que você está dando um new no objeto, toda vez que retorna o loop. New no objeto, significa instanciar um objeto, perdendo assim toda referência que vc tinha nele anteriormente.
Tente retirar ele de dentro do loop. Fica assim:
publicstaticVectorcadastraArea(){Scannerler=newScanner(System.in);Integercodigo,opcao;Stringnome,descricao;VectorvetorArea=newVector();Areaarea=newArea();do{System.out.println("Digite o código da área: ");codigo=validaCodigo(vetorArea);area.setCodigo(codigo);
adrian.gois
Desculpa… Desconsidere o que falei anteriormente e siga o que o colega ai falou… Realmente o problema é no seu vetor.
Quando vc sai do menu, perde a referencia ao vetor que vc cadastrou os codigos.
Faz uma variavel static fora de tudo.
Fica assim:
importjava.util.Scanner;importjava.util.Vector;publicclassPrincipal{privatestaticVectorvetorAreasCadastradas=newVector();publicstaticvoidmain(String[]args){Scannerler=newScanner(System.in);Vectorvetor=newVector();Integeropc;do{System.out.println("Digite a opção:\n1- Cadastrar\n2- Alterar\n0- Sair");opc=ler.nextInt();if(opc==1)vetor=cadastraArea();if(opc==2)alteraArea(vetor);}while(opc!=0);}publicstaticVectorcadastraArea(){Scannerler=newScanner(System.in);Integercodigo,opcao;Stringnome,descricao;VectorvetorArea=newVector();do{//Area area = new Area(); Areaarea=newArea();System.out.println("Digite o código da área: ");codigo=validaCodigo(vetorAreasCadastradas);area.setCodigo(codigo);System.out.println("Digite o nome da área de código "+codigo+": ");nome=validaNome(vetorAreasCadastradas);area.setNome(nome);System.out.println("Digite uma descrição para "+nome+": ");descricao=validaDescricao(vetorAreasCadastradas);area.setDescricao(descricao);vetorAreasCadastradas.add(area);System.out.println("Deseja cadastrar mais uma área? 1- Sim 2- Não");opcao=ler.nextInt();}while(opcao==1);returnvetorAreasCadastradas;}publicstaticvoidalteraArea(Vectorvt){Scannerler=newScanner(System.in);Integeropcao,codArea;StringnovoNome;System.out.println("O que deseja alterar? 1- Nome 2- Descrição");opcao=ler.nextInt();switch(opcao){case1:{System.out.println("Digite o código da área que deseja alterar: ");codArea=ler.nextInt();ler.nextLine();for(intaux=0;aux<vt.size();aux++){Areaareas=(Area)vt.get(aux);if(areas.getCodigo()==codArea){System.out.println("Area: "+areas.getNome());System.out.println("Descrição: "+areas.getDescricao());System.out.println("Digite o novo nome: ");novoNome=ler.nextLine();areas.setNome(novoNome);vt.add(areas);break;}}}}}publicstaticIntegervalidaCodigo(VectorvtArea){Scannerler=newScanner(System.in);Integercod=ler.nextInt();for(intaux=0;aux<vtArea.size();aux++){Areaareas=(Area)vtArea.get(aux);while(cod==areas.getCodigo()){System.out.println("Este código já existe. Escolha outro: ");cod=ler.nextInt();}}returncod;}publicstaticStringvalidaNome(VectorvtArea){Scannerler=newScanner(System.in);Stringnom=ler.nextLine();for(intaux=0;aux<vtArea.size();aux++){Areaareas=(Area)vtArea.get(aux);while(nom.equalsIgnoreCase(areas.getNome())){System.out.println("Inválido. Digite novamente: ");nom=ler.nextLine();}}returnnom;}publicstaticStringvalidaDescricao(VectorvtArea){Scannerler=newScanner(System.in);Stringdescr=ler.nextLine();returndescr;}}
O segredo tá em private static Vector vetorAreasCadastradas = new Vector();
agora é uma variável estatica que vc pode referenciar a qualquer momento.
Thiago_Luis
Fala cara, blza?
Meu, eu fiz umas alterações cara, veja se vc entende.
Por enquanto, só fiz funfar a parte da da validação.
O que eu fiz foi passar como parâmetro para o cadastraArea, o vetor correspondente.
Daí no cadastraArea, vc não precisa mais criar outro vetor, era esse o problema.
Veja se vc entende:
importjava.util.Scanner;importjava.util.Vector;publicclassHospital{publicstaticvoidmain(String[]args){Scannerler=newScanner(System.in);Vector<Area>vetor=newVector<Area>();Integeropc;do{System.out.println("Digite a opção:\n1- Cadastrar\n2- Alterar\n0- Sair");opc=ler.nextInt();if(opc==1)vetor=cadastraArea(vetor);if(opc==2)alteraArea(vetor);}while(opc!=0);}publicstaticVector<Area>cadastraArea(Vector<Area>vetorArea){Scannerler=newScanner(System.in);Integercodigo,opcao;Stringnome,descricao;do{Areaarea=newArea();System.out.println("Digite o código da área: ");codigo=validaCodigo(vetorArea);area.setCodigo(codigo);System.out.println("Digite o nome da área de código "+codigo+": ");nome=validaNome(vetorArea);area.setNome(nome);System.out.println("Digite uma descrição para "+nome+": ");descricao=validaDescricao(vetorArea);area.setDescricao(descricao);vetorArea.add(area);System.out.println("Deseja cadastrar mais uma área? 1- Sim 2- Não");opcao=ler.nextInt();}while(opcao==1);returnvetorArea;}publicstaticvoidalteraArea(Vector<Area>vt){Scannerler=newScanner(System.in);Integeropcao,codArea;StringnovoNome;System.out.println("O que deseja alterar? 1- Nome 2- Descrição");opcao=ler.nextInt();switch(opcao){case1:{System.out.println("Digite o código da área que deseja alterar: ");codArea=ler.nextInt();ler.nextLine();for(intaux=0;aux<vt.size();aux++){Areaareas=(Area)vt.get(aux);if(areas.getCodigo()==codArea){System.out.println("Area: "+areas.getNome());System.out.println("Descrição: "+areas.getDescricao());System.out.println("Digite o novo nome: ");novoNome=ler.nextLine();areas.setNome(novoNome);vt.add(areas);break;}}}}}publicstaticIntegervalidaCodigo(Vector<Area>vtArea){Scannerler=newScanner(System.in);Integercod=ler.nextInt();for(intaux=0;aux<vtArea.size();aux++){Areaareas=(Area)vtArea.get(aux);while(cod==areas.getCodigo()){System.out.println("Este código já existe. Escolha outro: ");cod=ler.nextInt();}}returncod;}publicstaticStringvalidaNome(Vector<Area>vtArea){Scannerler=newScanner(System.in);Stringnom=ler.nextLine();for(intaux=0;aux<vtArea.size();aux++){Areaareas=(Area)vtArea.get(aux);while(nom.equalsIgnoreCase(areas.getNome())){System.out.println("Inválido. Digite novamente: ");nom=ler.nextLine();}}returnnom;}publicstaticStringvalidaDescricao(Vector<Area>vtArea){Scannerler=newScanner(System.in);Stringdescr=ler.nextLine();returndescr;}}
Ah, com Vector e Colleciotns, use sempre Generics. É um conceito muito interessante :D
Abraço
adrian.gois
Tambem pode funcionar a solução do companheiro acima, porem vc terá que alterar o metodo de validaçao, pra ele receber como parametro o vetor, digamos GLOBAL…
S
shintalg
Senhores, muito obrigado pela presteza!!!
As duas soluções apresentadas solucionam muito bem meu problema!!
E, além disso, me ajudaram a entender e perceber algumas coisinhas que eu não estava vendo!