Gente, me ajuda.
Estou precisando pra um trabalho da faculdade.
No meu for, quero que caso a pessoa tenha digitado errado algum exame que não está na lista, o for repete, até a pessoa digitar algum exame na lista, eu tentei adicionar um Do… While para controlar isso, mas não está funcionando, espero que tenha dado para entender, segue o código.
packagebin;importjava.util.ArrayList;importjava.util.Scanner;publicclassPrincipal{staticArrayList<Paciente>pacientes=newArrayList<>();staticArrayList<Consulta>consultas=newArrayList<>();staticArrayList<Medico>medicos=newArrayList<>();staticArrayList<Exame>exames=newArrayList<>();publicstaticvoidmain(String[]args){inti;Scannerin=newScanner(System.in);medicos.add(newMedico("Carlos Rena"));medicos.add(newMedico("Amanda Silva"));medicos.add(newMedico("Adriana Castro"));medicos.add(newMedico("João Guilherme"));medicos.add(newMedico("Lucila Ferreira"));medicos.add(newMedico("Leonardo Aurelio"));medicos.add(newMedico("Felipe Farias"));exames.add(newExame("Cardiologista"));exames.add(newExame("Dentista"));exames.add(newExame("Urologista"));exames.add(newExame("Clinica Geral"));exames.add(newExame("Ginecologista"));exames.add(newExame("Ortopedista"));exames.add(newExame("Dermatologista"));System.out.println("Bem-Vindo ao cadastro de consulta");System.out.println("---------------------------------");System.out.println("Informe seu nome");Stringnome=in.nextLine();pacientes.add(newPaciente(nome));//Ao se informar um nome se adiciona o PacienteSystem.out.println("Selecione o exame");System.out.println(exames);//Lista os examesStringtipoExame=in.nextLine();do{for(i=0;i<exames.size();i++){// For para percorrer a lista e comparar o exame selecionado se realmente está na listaGif(tipoExame.equals(exames.get(i).getTipoExame())){System.out.println("OK");break;}elseif(i==exames.size()-1){//Caso não possua o exame digitadoSystem.out.println("Exame não encontrado, escolha um dos exames citados");}}}while(i==exames.size()-1);}}
O equal não é melhor forma de verificar strings, tente matches() ou indexOf() ja tive problemas com algumas funções java na hora de comparar alguns char então acredito que o mais indicado seja a função matches
G
Guilherme_Farias
Interessante, não conhecia o matches(). Já estou fazendo uns testes aqui com ele rs
Mas minha duvida mesmo é com o Do… While
P
peczenyj2 likes
cara de onde vc tirou isso?
equals vai fazer o que foi programado: verificar se as strings são iguais.
se vc precisa fazer algo alem disso, ok, use outros metodos, mas não da pra afirmar que não é a melhor forma.
S
Solucao aceita
staroski1 like
Creio que andou lendo material equivocado.
O método matches serve para verificar se a String atende à expressão regular (regex) passada por parâmetro.
O método indexOf retorna o índice da String passada por parâmetro ou -1 se ela não estiver contida.
Os métodos equals ou equalsIgnoreCase comparam se um objeto String é igual ao outro, o segundo, como o nome sugere, é case insensitive.
Outra coisa, não implemente seu programa todo dentro do método main e não faça tudo estático.
Exemplo:
packagebin;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassPrincipal{publicstaticvoidmain(String[]args){Principalprograma=newPrincipal();programa.executar();}privatefinalScannerin=newScanner(System.in);privateList<Exame>exames=carregarExames();privateList<Medico>medicos=carregarMedicos();privateList<Consulta>consultas=newArrayList<>();privateList<Paciente>pacientes=newArrayList<>();publicvoidexecutar(){System.out.println("Bem-Vindo ao cadastro de consulta");System.out.println("---------------------------------");Pacientepaciente=cadastrarPaciente();pacientes.add(paciente);System.out.println("Paciente cadastrado: "+paciente.getNome());Exameexame=selecionarExame();System.out.println("Exame selecionado: "+exame.getTipoExame());}privateList<Exame>carregarExames(){List<Exame>exames=newArrayList<>();exames.add(newExame("Cardiologista"));exames.add(newExame("Dentista"));exames.add(newExame("Urologista"));exames.add(newExame("Clinica Geral"));exames.add(newExame("Ginecologista"));exames.add(newExame("Ortopedista"));exames.add(newExame("Dermatologista"));returnexames;}privateList<Medico>carregarMedicos(){List<Medico>medicos=newArrayList<>();medicos.add(newMedico("Carlos Rena"));medicos.add(newMedico("Amanda Silva"));medicos.add(newMedico("Adriana Castro"));medicos.add(newMedico("João Guilherme"));medicos.add(newMedico("Lucila Ferreira"));medicos.add(newMedico("Leonardo Aurelio"));medicos.add(newMedico("Felipe Farias"));returnmedicos;}privatePacientecadastrarPaciente(){System.out.println("Informe seu nome");Stringnome=in.nextLine();Pacientepaciente=newPaciente(nome);returnpaciente;}privateExameselecionarExame(){while(true){System.out.println("Selecione o exame");System.out.println(exames);StringtipoExame=in.nextLine();for(Exameexame:exames){if(tipoExame.equalsIgnoreCase(exame.getTipoExame())){returnexame;}}System.out.println("Exame não encontrado, escolha um dos exames citados");}}}
R
Reylimdo21
Na verdade o tratamento do java sobre char é bem debilitado, por isso funções como equal e indexof que comparam os bytes do caracetere apresentam falhas em interpretação de alguns caraceteres, principalmente por causa da origem do char.
Não sei se durante os calculos dos bytes ou na forma como é armazenado o char, 2 textos iguais aparecem como diferentes usando essa função isso ocorre normalmente por causa dos caracteres especiais, diria que tem alguma relação com tipo de formatação tipo utf-8 ou Ascii, mas não estou falando de carregar textos externo, e sim de texto digitados dentro do codigo font do aplicativo (deveriam estar na mesma formatação mas na prática acontece muitas falhas), disse que a função não funciona sempre por experiência propria
R
Reylimdo21
Na verdade não estou errado sugeri usar essas classes para validar justamente porque o equal pode afirmar que 2 strings iguais são diferentes por uma series de fatores ja tive muita dor de cabeça com isso justamente quando tinha caracteres especiais, por recomendação digo que para validar uma frase com mais sucesso voce pode utilizar indexOf() ou match isso por causa do modo como essas classes tratam o String.
Na prática
"\\b" != ‘\’+’\b’
Esse tipo de falha acontece no equal, não deveria mas acontece.
P
peczenyj
cara eu acho q é um problema de BIOS.
dê exemplos concretos com direito a codigo. sobre aqui uns exemplos pra gente ver:
S
staroski1 like
Posta um exemplo concreto, pois esse aí é inválido por alguns motivos:
Quando os operandos não são primitivos, o operador != compara referências e String não é um tipo primitivo;
A operação '\'+'\b' não retorna um objeto String e sim um char resultante da soma desses dois chars;
O caractere \ é utilizado como caractere de escape no Java então a String"\\b" nada mais é do que o caractere \ seguido do caractere b;
O '\' é inválido, pois falta o caractere seguinte ao símbolo de escape, já o '\b' corresponde ao charactere backspace.
R
Reylimdo21
Alinha que escrevi era só uma representação de um dos erros, e nao um erro em si, abandonei a muito tempo usar equal nesse tipo de objeto e meu estilo de solução funciona.
A propria função indexOf as vezes não acha o elemento dentro do texto, e isso não tem haver com erro de inserção de valores, não estarei continuando o assunto porque não estou querem ficar testando esses casos denovo.
Muitas vezes obtia o char de algum lugar na hora de testar o char no system.out estava perfeito quando passava no equal falava que era diferente.
Não tenho interesse em ficar criando um baita codigo tentando identificar os erros de tratamentos de primitivos do java, na epoca que mechia pelas funções principais tipo equal era sempre cada linha um erro era hora tentando mexer no texto para parar o erro interpretação hoje uso uma biblioteca propria minha que funciona sem um unico erro de comparação.
G
Guilherme_Farias
Só não sei se entendi ao certo isso, pq instanciou principal?
G
Guilherme_Farias
Poderia explicar um pouco melhor esse while e for também.
R
Reylimdo21
while (true) { //repete o bloco de código dentro white infinitamente
String tipoExame = in.nextLine(); // pega a escrita do teclado, no pronto de dialogo
for (Exame exame : exames) //passa por todos os exames listados
if (tipoExame.equalsIgnoreCase(exame.getTipoExame())) {
//Ve se o exame atual que esta sendo verificado no for é o mesmo que o usuário digitou
S
staroski
Instanciei a classe Principal para ter um objeto dela e poder invocar o método não-estático executar(), dessa forma não precisa ficar criando só variáveis e métodos estáticos.
while(true){// repete infinitamenteSystem.out.println(“Selecioneoexame”);System.out.println(exames);StringtipoExame=in.nextLine();// para cada objeto exame que existe dentro da lista de examesfor(Exameexame:exames){// verifica se o nome digitado é igual ao nome do exameif(tipoExame.equalsIgnoreCase(exame.getTipoExame())){// sai desse método retornando o objeto exame e quebrando o laço infinitoreturnexame;}}System.out.println(“Examenãoencontrado,escolhaumdosexamescitados”);}
S
staroski
Acho que você não está falando de Java, se estiver, deve estar há algum tempo sem programar. char é um tipo primitivo, não possui métodos e os tipos não primitivos possuem um método equals…
Mas pelo que você fala, receio ser somente um problema de character encoding entre o seu compilador e o ambiente de execução de seu programa.
Em Java não é legal escrever código assim char c = '¥';.
Quando você quer utilizar símbolos especiais, utilize o literal '\uXXXX onde XXXX é o código unicode do símbolo.
F
FearX
Hm, isso aqui eu não sabia, @staroski. Alguma explicação específica para isso?
R
Reylimdo21
Para ser sincero hoje faço todos os tratamentos de char por inteiro então nem vejo mais isso.