Controle de repetição

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.

package bin;

import java.util.ArrayList;
import java.util.Scanner;

public class Principal {	
	
	static ArrayList<Paciente> pacientes = new ArrayList<>();
    static ArrayList<Consulta> consultas = new ArrayList<>();
    static  ArrayList<Medico> medicos = new ArrayList<>();
    static ArrayList<Exame> exames = new ArrayList<>();

	public static void main(String[] args) {
		int i;
		Scanner in = new Scanner(System.in);
		
		medicos.add(new Medico("Carlos Rena"));
        medicos.add(new Medico("Amanda Silva"));
        medicos.add(new Medico("Adriana Castro"));
        medicos.add(new Medico("João Guilherme"));
        medicos.add(new Medico("Lucila Ferreira"));
        medicos.add(new Medico("Leonardo Aurelio"));
        medicos.add(new Medico("Felipe Farias"));
        
        exames.add(new Exame("Cardiologista"));
        exames.add(new Exame("Dentista"));
        exames.add(new Exame("Urologista"));
        exames.add(new Exame("Clinica Geral"));
        exames.add(new Exame("Ginecologista"));
        exames.add(new Exame("Ortopedista"));
        exames.add(new Exame("Dermatologista"));

		System.out.println("Bem-Vindo ao cadastro de consulta");
		System.out.println("---------------------------------");
		System.out.println("Informe seu nome");
		String nome = in.nextLine();
		pacientes.add(new Paciente(nome)); //Ao se informar um nome se adiciona o Paciente
		System.out.println("Selecione o exame");
        System.out.println(exames); //Lista os exames
        String tipoExame = in.nextLine();
        
        
        do {
        		
        for (i = 0; i < exames.size();i++) { // For para percorrer a lista e comparar o exame selecionado se realmente está na listaG
        	
        	if(tipoExame.equals(exames.get(i).getTipoExame())) {
            	System.out.println("OK");
            	break;
            	
            }else if (i == exames.size() -1){ //Caso não possua o exame digitado
            	System.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

Interessante, não conhecia o matches(). Já estou fazendo uns testes aqui com ele rs
Mas minha duvida mesmo é com o Do… While

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.

2 curtidas

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:

package bin;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {
        Principal programa = new Principal();
        programa.executar();
    }

    private final Scanner in = new Scanner(System.in);

    private List<Exame> exames = carregarExames();
    private List<Medico> medicos = carregarMedicos();

    private List<Consulta> consultas = new ArrayList<>();
    private List<Paciente> pacientes = new ArrayList<>();

    public void executar() {
        System.out.println("Bem-Vindo ao cadastro de consulta");
        System.out.println("---------------------------------");

        Paciente paciente = cadastrarPaciente();
        pacientes.add(paciente);
        System.out.println("Paciente cadastrado: " + paciente.getNome());

        Exame exame = selecionarExame();
        System.out.println("Exame selecionado: " + exame.getTipoExame());
    }

    private List<Exame> carregarExames() {
        List<Exame> exames = new ArrayList<>();
        exames.add(new Exame("Cardiologista"));
        exames.add(new Exame("Dentista"));
        exames.add(new Exame("Urologista"));
        exames.add(new Exame("Clinica Geral"));
        exames.add(new Exame("Ginecologista"));
        exames.add(new Exame("Ortopedista"));
        exames.add(new Exame("Dermatologista"));
        return exames;
    }

    private List<Medico> carregarMedicos() {
        List<Medico> medicos = new ArrayList<>();
        medicos.add(new Medico("Carlos Rena"));
        medicos.add(new Medico("Amanda Silva"));
        medicos.add(new Medico("Adriana Castro"));
        medicos.add(new Medico("João Guilherme"));
        medicos.add(new Medico("Lucila Ferreira"));
        medicos.add(new Medico("Leonardo Aurelio"));
        medicos.add(new Medico("Felipe Farias"));
        return medicos;
    }

    private Paciente cadastrarPaciente() {
        System.out.println("Informe seu nome");
        String nome = in.nextLine();
        Paciente paciente = new Paciente(nome);
        return paciente;
    }

    private Exame selecionarExame() {
        while (true) {
            System.out.println("Selecione o exame");
            System.out.println(exames);
            String tipoExame = in.nextLine();
            for (Exame exame : exames) {
                if (tipoExame.equalsIgnoreCase(exame.getTipoExame())) {
                    return exame;
                }
            }
            System.out.println("Exame não encontrado, escolha um dos exames citados");
        }
    }
}
1 curtida

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

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.

cara eu acho q é um problema de BIOS.

dê exemplos concretos com direito a codigo. sobre aqui uns exemplos pra gente ver:

Posta um exemplo concreto, pois esse aí é inválido por alguns motivos:

  1. Quando os operandos não são primitivos, o operador != compara referências e String não é um tipo primitivo;
  2. A operação '\'+'\b' não retorna um objeto String e sim um char resultante da soma desses dois chars;
  3. O caractere \ é utilizado como caractere de escape no Java então a String "\\b" nada mais é do que o caractere \ seguido do caractere b;
  4. O '\' é inválido, pois falta o caractere seguinte ao símbolo de escape, já o '\b' corresponde ao charactere backspace.
1 curtida

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.

Para você ter uma ideia tinha epoca que eu usava algo tipo
char c = ‘¥’;
if( c.equal(‘¥’)){

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.

Só não sei se entendi ao certo isso, pq instanciou principal?

Poderia explicar um pouco melhor esse while e for também.

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

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. :wink:

while (true) {  // repete infinitamente
    System.out.println(“Selecione o exame”);
    System.out.println(exames);
    String tipoExame = in.nextLine();

    // para cada objeto exame que existe dentro da lista de exames
    for (Exame exame : exames) {

        // verifica se o nome digitado é igual ao nome do exame
        if (tipoExame.equalsIgnoreCase(exame.getTipoExame())) {
            // sai desse método retornando o objeto exame e quebrando o laço infinito
            return exame;
        }
    }
    System.out.println(“Exame não encontrado, escolha um dos exames citados”);
}

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. :wink:

Hm, isso aqui eu não sabia, @staroski. Alguma explicação específica para isso?

Para ser sincero hoje faço todos os tratamentos de char por inteiro então nem vejo mais isso.

tipo:
String txt = “0123456789”;
if( (int) ‘c’ == (int) txt.charAt(1)){
System.out.println(“Isso nunca falha”)
}