Implementação de filtros em listas encadeadas e

Boa tarde pessoal, tudo bem? Estou desenvolvendo um projeto de uma aplicação simples em Java, com listas encadeadas para a faculdade, sem armazenamento em banco de dados, onde preciso desenvolver um sistema que:

  • Cadastre Pacientes; OK
  • Cadastre Médicos; OK
  • Agende uma consulta, onde na hora de selecionar o médico (única parte do agendamento que necessita de filtro), eu informe uma especialidade médica e esta busca busque todos os médicos com aquela especialidade e liste eles para mim, onde eu possa selecioná-lo (ou não, caso não exista a especialidade, retorne alguma mensagem de aviso) e seguir no preenchimento dos dados;
  • Listas todos os pacientes cadastrados; OK
  • Listas todos os médicos cadastrados; OK
  • Listas todas as consultas cadastradas; OK
  • Listas as consultas cadastradas por paciente;
  • Listas as consultas cadastradas por médico;

Todos os itens com OK eu consegui desenvolver, só não consegui aplicar os filtros nas listagens e na seleção do médico na hora de agendar a consulta. Também não consegui fazer com que cada consulta gerada, ao invés de eu preencher o ID, ele gere um ID sozinho que seja incrementado a cada novo agendamento, afim de evitar conflito de numeração de ID’s. E também não consegui gerar um método de inserir Consultas no início da ListaDeConsultas.

Vocês conseguiriam me dar uma luz em como solucionar isto, pois como estou no início da graduação em ADS estou bem cru nestes processos. Obrigado pela atenção!

OBS: caso queiram, deixo um link com o meu projeto feito no Eclipse para download

mas vou postar aqui também o código para todos verem:


*** CLASSE: Principal ***

package SistemaConsultas;

public class Principal {

public static void main(String[] args) {
	
	InterfaceDeUsuario interacao ;
	interacao = new InterfaceDeUsuario();
	interacao.apresentarInterface();

}

}

*** CLASSE: Consulta ***

package SistemaConsultas;

public class Consulta {

//ATRIBUTOS
private String id;
private String medico;
private String paciente;
private String dia;
private String mes;
private String ano;
private String hora;
	
public Consulta(String id, String medico, String paciente, String dia, String mes, String ano, String hora) {
	
	//MÉTODO CONSTRUTOR
	this.id = id;
	this.medico = medico;
	this.paciente = paciente;
	this.dia = dia;
	this.mes = mes;
	this.ano = ano;
	this.hora = hora;
	}

public String getId() {
	return id;
}

public void setId(String id) {
	this.id = id;
}

public String getMedico() {
	return medico;
}

public void setMedico(String medico) {
	this.medico = medico;
}

public String getPaciente() {
	return paciente;
}

public void setPaciente(String paciente) {
	this.paciente = paciente;
}

public String getDia() {
	return dia;
}

public void setDia(String dia) {
	this.dia = dia;
}

public String getMes() {
	return mes;
}

public void setMes(String mes) {
	this.mes = mes;
}

public String getAno() {
	return ano;
}

public void setAno(String ano) {
	this.ano = ano;
}

public String getHora() {
	return hora;
}

public void setHora(String hora) {
	this.hora = hora;
}

}

*** CLASSE: ExcecaoDeIndiceInexistente ***

package SistemaConsultas;

public class ExcecaoDeIndiceInexistente extends Exception {

}

*** CLASSE: InterfaceDeUsuario ***

package SistemaConsultas;

import java.util.Scanner;

import SistemaConsultas.ExcecaoDeIndiceInexistente;

import java.util.ArrayList;

public class InterfaceDeUsuario {

private ArrayList <Paciente> pacientesDoEstabelecimento = new ArrayList <Paciente>();
private ArrayList <Medico> medicosDoEstabelecimento = new ArrayList <Medico>();
private ListaDeConsultas consultasDoEstabelecimento = new ListaDeConsultas ();
	
	
public void apresentarInterface() {
	
	Scanner entrada = new Scanner(System.in);
	this.mostrarMenuOpcoes();
	int opcao = entrada.nextInt();
	while(opcao != 0) {
		
		switch(opcao) {
		
		case 1: // CADASTRAR PACIENTE
			System.out.println("Nome: ");
			entrada.nextLine();
			String nome = entrada.nextLine();
			System.out.println("CPF: ");
			String cpf = entrada.nextLine();
			System.out.println("Endereço: ");
			String endereco = entrada.nextLine();
			Paciente tempPaciente = new Paciente(nome, cpf, endereco);
			pacientesDoEstabelecimento.add(tempPaciente);
			break;
			
		case 2: // CADASTRAR MEDICO
			System.out.println("Nome: ");
			entrada.nextLine();
			String nomeM = entrada.nextLine();
			System.out.println("CPF: ");
			String cpfM = entrada.nextLine();
			System.out.println("Especialidade: ");
			String especialidadeM = entrada.nextLine();
			Medico tempMedico = new Medico(nomeM, cpfM, especialidadeM);
			medicosDoEstabelecimento.add(tempMedico);
			break;
			
		case 3: // AGENDAR CONSULTA
			System.out.println("ID: ");
			entrada.nextLine();
			String id = entrada.nextLine();
			System.out.println("Médico: ");
			String medico = entrada.nextLine();
			System.out.println("Paciente: ");
			String paciente = entrada.nextLine();
			System.out.println("Dia: ");
			String dia = entrada.nextLine();
			System.out.println("Mês: ");
			String mes = entrada.nextLine();
			System.out.println("Ano: ");
			String ano = entrada.nextLine();
			System.out.println("Hora: ");
			String hora = entrada.nextLine();
			Consulta tempConsulta = new Consulta(id, medico, paciente, dia, mes, ano, hora);
			consultasDoEstabelecimento.incluirNoFinal(tempConsulta);
			break;
			
		case 4: // LISTAR PACIENTES CADASTRADOS
			
			for(int p=0 ; p<pacientesDoEstabelecimento.size() ; p++ ) {
				tempPaciente = pacientesDoEstabelecimento.get(p);
				System.out.println("Nome: "+tempPaciente.getNome());
				System.out.println("CPF: "+tempPaciente.getCpf());
				System.out.println("Endereço: "+tempPaciente.getEndereco());
			}
				
			break;
			
		case 5: // LISTAR MÉDICOS CADASTRADOS
			
			for(int m=0 ; m<medicosDoEstabelecimento.size() ; m++ ) {
				tempMedico = medicosDoEstabelecimento.get(m);
				System.out.println("Nome: "+tempMedico.getNomeM());
				System.out.println("CPF: "+tempMedico.getCpfM());
				System.out.println("Especialidade: "+tempMedico.getEspecialidadeM());
			}
				
			break;
			
		case 6: // LISTAR TODAS AS CONSULTAS AGENDADAS
			
			try {
				for(int c=0; c<consultasDoEstabelecimento.getQuantasConsultas() ; c++) {
					tempConsulta = consultasDoEstabelecimento.getConsulta(c);
					System.out.println("ID: "+tempConsulta.getId());
					System.out.println("Paciente: "+tempConsulta.getPaciente());
					System.out.println("Medico: "+tempConsulta.getMedico());
					System.out.println("Data e Horário: "+tempConsulta.getDia()+"/"+tempConsulta.getMes()+"/"+tempConsulta.getAno()+" - "+tempConsulta.getHora()+":00");				
				}
			}
			
			catch(ExcecaoDeIndiceInexistente erro) {
				System.out.println("Índice fora dos limites!");
			}	
			
			break;
		
		//case 7: // LISTAR CONSULTAS AGENDADAS POR PACIENTE
			
		
			
		//case 8: // LISTAR CONSULTAS AGENDADAS POR MÉDICO
			
			
		}
		this.mostrarMenuOpcoes();
		opcao = entrada.nextInt(); 
		}
	}
		
private void mostrarMenuOpcoes() {
	System.out.println("1 - Cadastrar Paciente");
	System.out.println("2 - Cadastrar Médico");
	System.out.println("3 - Agendar Consulta");
	System.out.println("4 - Listar Pacientes cadastrados");
	System.out.println("5 - Listar Médicos cadastrados");
	System.out.println("6 - Listar todas Consultas agendadas");
	//System.out.println("7 - Listar Consultas agendadas por Paciente");
	//System.out.println("8 - Listar Consultas agendadas por médico");
	System.out.println("0 - Sair");
}

}


*** CLASSE: ListaDeConsultas ***
package SistemaConsultas;

public class ListaDeConsultas {

private Consulta[] asConsultas = new Consulta [1000];
private int quantasConsultas = 0;

//INCLUI UMA CONSULTA NO FIM DA LISTA
public void incluirNoFinal (Consulta consulta) {
	this.asConsultas[quantasConsultas] = consulta;
	quantasConsultas++;
}

//INCLUI UMA CONSULTA NO INÍCIO DA LISTA ********************************************************
public void incluirNoInicio (Consulta consulta) {
	
}

//REMOVE UMA CONSULTA DO FIM DA LISTA
public void removerNoFim (Consulta consulta) {	
	this.asConsultas[quantasConsultas] = consulta;
	quantasConsultas--;
}

//INDICA O TAMANHO DA LISTA
public int getQuantasConsultas() {
	return quantasConsultas;
}

//RETORNA A CONSULTA QUE ESTÁ NA POSIÇÃO DA LISTA INDICADA NO ARGUMENTO "ÍNDICE"
public Consulta getConsulta(int indice) throws ExcecaoDeIndiceInexistente {
	if(indice>=0 && indice<quantasConsultas) {
		return asConsultas[indice];
	}
	throw new ExcecaoDeIndiceInexistente();
}

}

*** CLASSE: Medico ***

package SistemaConsultas;

public class Medico {

//ATRIBUTOS
private String nomeM;
private String cpfM;
private String especialidadeM;

public Medico (String nomeM, String cpfM, String especialidadeM) {
	
	//MÉTODO CONSTRUTOR
	this.nomeM = nomeM;
	this.cpfM = cpfM;
	this.especialidadeM = especialidadeM;
}

public String getNomeM() {
	return nomeM;
}

public void setNomeM(String nomeM) {
	this.nomeM = nomeM;
}

public String getCpfM() {
	return cpfM;
}

public void setCpfM(String cpfM) {
	this.cpfM = cpfM;
}

public String getEspecialidadeM() {
	return especialidadeM;
}

public void setEspecialidadeM(String especialidadeM) {
	this.especialidadeM = especialidadeM;
}

}

*** CLASSE: Paciente ***

package SistemaConsultas;

public class Paciente {

//ATRIBUTOS
private String nome;
private String cpf;
private String endereco;

public Paciente (String nome, String cpf, String endereco) {
	
	//MÉTODO CONSTRUTOR
	this.nome = nome;
	this.cpf = cpf;
	this.endereco = endereco;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public String getCpf() {
	return cpf;
}

public void setCpf(String cpf) {
	this.cpf = cpf;
}

public String getEndereco() {
	return endereco;
}

public void setEndereco(String endereco) {
	this.endereco = endereco;
}

}

Amigo até tentei rodar seu projeto e executar, mas ficou meio confuso e trabalhoso. O melhor é você descrever em como pensou em resolver o problema e fazer um esboço da função aí sim poderemos ajudar. É trabalhoso demais tentar entender todo o seu projeto para resolver apenas uma pontualidade. Se você mostrar onde realmente enroscou a ajuda virá mais facil. Por exemplo, ao invés de dizer façam a lista pra mim, diga eu fiz este metodo x e ele não funciona , o que pode estar errado. entende?

Perfeito @essevaiproale, estive tentando e consegui achar uma forma de fazê-las, mas de antemão, muito obrigado pelo apoio e pela dica, em um próximo tópico irei me policiar para formular melhor a questão. Muito obrigado!

Aproveitando o gancho, pois não consegui efetivar a minha tentativa, eu tenho uma classe chamada ListaDeConsultas criada para armazenar uma Lista encadeada de consultas que eu adicionarei com base nos atributos da classe Consulta, chamando assim cada objeto consulta armazenado como consultaDoEstabelecimento. e eu tentei fazer um try catch para expor esta lista de consultas do estabelecimento filtrando pelo nome do paciente, através de um scanner onde armazeno o nome do mesmo e tento fazer um while para ficar buscando todas as consultas agendadas para o paciente x naquela lista, porém não consigo fazer buscar no local correto, sabem me dizer o que está errado?

Segue o Try Catch que fiz:

public void consultaPorPaciente() {

				Scanner entrada = new Scanner(System.in);

				System.out.print("Informe o nome do paciente: ");
				String nomePaciente = entrada.nextLine();

				int indice = 0;
				while (indice < tamanho()) {
					try {
					Consulta tempConsulta = ListaDeConsultas.consultasDoEstabelecimento.get(indice);
					if (consultasDoEstabelecimento.getPaciente().getNome().equals(nomePaciente)) {

						Consulta paciente = get(indice);

						System.out.println("Paciente com consulta agendada: " + Paciente.getPaciente().getNome());

						String pacienteDataConsulta = consultasDoEstabelecimento.getDia() + "/" + .getMes() + "/" + .getAno() + " - " + .getHora() + ":00";
						System.out.println("Data agendada: " + pacienteDataConsulta);
					}
					}//Final do try
					catch (ExcecaoDeIndiceInexistente erro) {
						System.out.println("Índice fora do limite");
					}
					indice++;
				}

Esta é a forma como criei a lista no início da interface:

private ListaDeConsultas consultasDoEstabelecimento = new ListaDeConsultas ();


Estes são os atributos da classe Consulta:

public class Consulta {

//ATRIBUTOS
private String id;
private String medico;
private String paciente;
private String dia;
private String mes;
private String ano;
private String hora;

E esta é a classe ListaDeConsultas:

public class ListaDeConsultas {

private Consulta[] asConsultas = new Consulta [1000];
private int quantasConsultas = 0;

public Consulta getConsulta(int indice) throws ExcecaoDeIndiceInexistente {
if(indice>=0 && indice<quantasConsultas) {
return asConsultas[indice];
}
throw new ExcecaoDeIndiceInexistente();