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:
-
Vc tem uma lista de professores.
-
Para cada horario vc vê quem está livre. - > painel 1
-
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.