Como cruzar informações de matrizes!

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!!!

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

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!

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 ...
}

e onde entra os arrays?

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:

[code]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;
}	

}[/code]

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

[code]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());
	}
}

}[/code]

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.