Como cruzar informações de matrizes!

5 respostas
C

Olá pessoal, tenho dois arrays bidimensionais. No primeiro, cada posição i,j significa um horario. Em cada horario é colocado o nome de professores disponiveis para aquele horario, em forma de String. No segundo array irá conter em cada posição i,j uma determinada disciplina. O problema é que tenho que cruzar as informações das duas de modo em q consiga comparar se a disciplina estara disponivel no mesmo horário do professor que leciona esta mesma disciplina. Sendo q o array das disciplinas é dinâmico. Me Ajudem!!!

5 Respostas

peczenyj

Ola.

Vc tem um problema de modelgem.

Ao meu ver vc tem tres entidades:

Professor
Horario
Disciplina

Uma disciplina TEM-UM Professor e TEM-UM Horario

class Disciplina{ Horario horario; Professor professor; }

Nesse caso, horario pode ser um objeto que representa o dia da semana, hora inicio e hora fim.

Um professor não pode estar em 2 lugares ao mesmo tempo, certo? Então ele TEM-UM horario também (na verdade uma lista de horarios!).

Digamos que vc faça um

Disciplina math01= new Disciplina("matematica"); // exemplo grosseiro
math01.setHorario(H010A); // 01 - segunda 0A - primeira hora da manhã
math01.setProfessor(ORACIO); // tcharam!

O objeto ORACIO tem uma lista de horarios onde ele foi alocado.
vc vai procurar se o horario H010A ja foi utilizado nele. Se sim, então vc lança alguma exception, por exemplo.

Um exemplo muito mais pratico e facil de entender é o das vagas de carro:
http://fragmental.com.br/wiki/index.php/Fantoches#Bad_Smell:_For.C3.A7as_Ocultas

C

Olá, grata pela ajuda, mas na verdade um professor pode lecionar mais de uma disciplina e é esse o meu maior desafio!!! Caso saiba uma saída para este caso…me ajude!

Kknd

Então você pode remover o campo professor da classe disciplina, e criar uma classe Professor:

public class Professor
{
       private List<Disciplina> disciplinas; // Lista de disciplinas
 
       ... continua ...
}
C

e onde entra os arrays?

peczenyj

Vamos começar pelo começo.

Vc pode utilizar Arrays, não tem problema. Agora vc pode modelar o seu problema de uma forma muito mais rica e, principalmente, muito mais proximo da realidade.

Não estou fornecendo uma solução pronta para o seu problema em específico mas... dou umas dicas no fim.

Vejamos.

Um horario escolar tem o que? Dia da semana e faixa de horario, certo?

Vamos simplificar desse jeito:

enum Dia { seg, qua, sex };
enum Hora { manha, tarde };

facil né? Enumerações fazem parte do java 1.5 e vc não precisa utiliza-las.

Agora vamos pensar no horario:

class Horario{
	private Dia dia;
	private Hora hora;
	public Horario(Dia dia, Hora hora){
		this.dia = dia;
		this.hora = hora;
	}
       // outros metodos!
}

Continua sendo facil. Entretanto eu ainda preciso, para este exemplo, dois métodos: equals e toString

public String toString(){
		return "{ Dia: " + dia.name() + ", Hora: " + hora.name() + "}";
	}
	public boolean equals(Object o){
		boolean teste = false;	
		if (o instanceof Horario){
			Horario x = (Horario) o;
			teste = ((x.dia == this.dia) && (x.hora == this.hora));
		}
		return teste;
	}

O toString é para facilitar na hora de fazer um 'relatorio'.
O equals eu preciso para fazer buscas. Vejamos mais adiante.

Vamos para a classe Professor:

class Professor{
	private String nome;
	private List<Horario> horarios;
	public Professor(String nome) {
		this.nome = nome;
		this.horarios = new ArrayList<Horario>();
	}	
        // outros metodos
}

Continua sendo facil, certo? Eu tenho uma lista de horarios onde eu não estou disponivel. É uma lista tipada usando generics.

Ainda vou precisar de 3 metodos

public String toString(){
		return this.nome;
	}
 	public boolean isBlock(Horario h){ // esta ocupado ?
 		return horarios.contains(h);
 	}
 	public void addHorario(Horario h){ // adiciona novo horario!
 	    horarios.add(h);
 	}

Ok, vamos la. E se eu tentar colocar um professor em mais de um lugar ao mesmo tempo? Tenho que fazer alguma coisa, como lançar uma exception

class ProfessorOcupadoException extends Exception{
	public ProfessorOcupadoException(String msg){ super(msg); }
}

Vamos ver toda a classe Disciplina:

class Disciplina{
	private String nome;
	private Horario horario;
	private Professor professor;
	public Disciplina(String nome) {
		this.nome = nome;
	}
	public String toString(){ return this.nome; }
	
	public void setHorarioProfessor(Horario horario,Professor professor)
	throws ProfessorOcupadoException{
		if (professor.isBlock(horario)){
			throw new ProfessorOcupadoException("Professor '" + professor + "' ocupado as " + horario );
		}	 
		professor.addHorario(horario);
		this.horario = horario;
		this.professor = professor;
	}	
}

O metodo setHorarioProfessor recebe um horario e um professor. SE o professor estiver dando outra materia nesse mesmo horario, nada feito, eu lanço uma exception e vc que se vire.
Se tudo estiver ok, eu registro esse horario e tudo fica certinho.

Vamos ver um simples teste

public class Teste {
	public static void main(String[] args) {
		Horario H010A = new Horario(Dia.seg,Hora.manha);
		Horario H010B = new Horario(Dia.seg,Hora.tarde);		

		Professor Oseias  = new Professor("Oseias");
		Professor Martins = new Professor("Martins");
		
		Disciplina Matematica = new Disciplina("Matematica");
		Disciplina Portugues  = new Disciplina("Portugues");
		
		tentaAtribuir(Matematica, H010A, Oseias); // ok
		tentaAtribuir(Portugues, H010A, Oseias);  // erro!
		tentaAtribuir(Portugues, H010A, Martins);  // ok
		tentaAtribuir(Portugues, H010B, Oseias);  // ok		
	}
	public static void tentaAtribuir(Disciplina d, Horario h, Professor p){
		try {
			d.setHorarioProfessor(h, p);
			System.out.println("Disciplina: " + d + " Professor: " + p + " as " + h);
		}catch(ProfessorOcupadoException poe){
			System.out.println(poe.getMessage());
		}
	}
}

Perceba que eu tento, primeiro, dar a disciplina de matematica pro professor oseias no horario de segunda de manhã. Tudo bem até então. So que o oseias é ninja, ele dá matematica e portugues. Pena que segunda de manhã ele não pode, pois ja esta ocupado. Entra o professor Martins. Segunda a tarde eu passo uma turma de portugues pra ele e está tudo bem.

Veja as minhas interações
Disciplina: Matematica Professor: Oseias as { Dia: seg, Hora: manha}
Professor 'Oseias' ocupado as { Dia: seg, Hora: manha}
Disciplina: Portugues Professor: Martins as { Dia: seg, Hora: manha}
Disciplina: Portugues Professor: Oseias as { Dia: seg, Hora: tarde}

Certo, mas o seu problema original é

Em um dado horario vc tem X professores disponíveis.
Em um dado horario vc tem uma disciplina.

Eu criei um metodo setHorarioProfessor por pura preguiça. Na verdade vc poderia setar o horario e o professor de formas separadas. Alias ai entra uma outra contraint: um professor tem uma lista de horarios vagos!

Um Horario, para um professor, pode estar bloqueado, por exemplo. Vc poderia colocar um atributo boolean 'bloqueado' na classe Horario e, toda a vez que vc fosse atribuir uma disciplina para um professor vc procuraria saber:

Se o professor tem aquele horario na lista E, se tiver, se aquele horario está vago!

Perceba como ficaria super simples:

1) Vc tem uma lista de professores.

2) Para cada horario vc vê quem está livre. - > painel 1

3) Cada disciplina tem um horario. -> painel 2

O relacionamento é trivial.

De uma pensada sobre o assunto e poste as suas duvidas e dificuldades. Se esta modelagem não adiantar, poste o seu codigo e vamos ver o que dá pra fazer.

Criado 14 de novembro de 2007
Ultima resposta 15 de nov. de 2007
Respostas 5
Participantes 3