Como usar o Contains()? [RESOLVIDO]

Quero add um elemento no ArrayList ensalamento, porém, ele precisa preencher alguns pre-requisitos…

boolean alocar(Turma turma, Sala sala) {
	TurmaEmSala enSala = new TurmaEmSala();
	
	if(!ensalamento.contains(Turma)){			
		if(turma.numAlunos > sala.capacidade){
			return false;
		}else if(turma.acessivel == sala.acessivel){
			ensalamento.add(enSala);
			return true;
		}		
	}

Acontece que a verificação - if(!ensalamento.contains(Turma)) - não está funcionando… acredito que eu esteja fazendo algo errado… alguém pode me ajudar?

Você postou todo o trecho do método alocar?

Pelo que deu pra ver pela assinatura do método:
boolean alocar(Turma turma, Sala sala) { //FAZ COISAS AQUI }

Você deveria está verificando o objeto turma com T minusculo e não maiúsculo, ficando assim:
if(!ensalamento.contains(turma)){ if(turma.numAlunos > sala.capacidade){ return false; }else if(turma.acessivel == sala.acessivel){ ensalamento.add(enSala); return true; } }

Explicando o .contains():
Ele serve para você verificar se na sua Collection (o teu ArrayList) possui um determinado elemento, então você deveria esta passando para ele teu objeto turma e não a classe Turma.

Na verdade, errei na hora de passar pra cá, o trecho correto é assim:

boolean alocar(Turma turma, Sala sala) {
TurmaEmSala enSala = new TurmaEmSala();

	if(!ensalamento.contains(turma)){			
		if(turma.numAlunos > sala.capacidade){
			return false;
		}else if(turma.acessivel == sala.acessivel){
			ensalamento.add(enSala);
			return true;
		}		
	}
	
return false;
}

Mesmo quando já tem a turma ele add do mesmo jeito…

Sim, esse é o trecho completo do método alocar sim…

Me tira uma dúvida.
Turma deve ser uma entidade ou um Pojo ai nesse teu código. Você lembrou de sobrescrever os métodos hashCode() e equals() de Turma?

Vou postar tudo aqui pra ficar melhor a visualização:

public class Ensalamento {

ArrayList<Sala> salas = new ArrayList<Sala>();
ArrayList<Turma> turmas = new ArrayList<Turma>();
ArrayList<TurmaEmSala> ensalamento = new ArrayList<TurmaEmSala>();

public Ensalamento() {
}

/**
 * @param salas
 * @param turmas
 * @param ensalamento
 */
public Ensalamento(ArrayList<Sala> salas, ArrayList<Turma> turmas, ArrayList<TurmaEmSala> ensalamento) {
	this.salas = salas;
	this.turmas = turmas;
	this.ensalamento = ensalamento;
}


void addSala(Sala sala){
	salas.add(sala);
}

void addTurma(Turma turma){
	turmas.add(turma);
}

Sala getSala(Turma turma){
	Sala retorno = null;
	if(ensalamento.contains(turma)){
		retorno = ensalamento.get(ensalamento.indexOf(turma)).sala;
	}
 	return retorno;
}

boolean salaDisponivel(Sala sala, int horario){
	return true;
}

boolean salaDisponivel(){
	
	return true;
}

boolean alocar(Turma turma, Sala sala) {
	TurmaEmSala enSala = new TurmaEmSala();
	
	if(!ensalamento.contains(turma)){			
		if(turma.numAlunos > sala.capacidade){
			return false;
		}else if(turma.acessivel == sala.acessivel){
			ensalamento.add(enSala);
			return true;
		}		
	}
	
return false;
}

}

public class TurmaEmSala {

Turma turma;
Sala sala;

public TurmaEmSala() {
}

/**
 * @param turma
 * @param sala
 */
public TurmaEmSala(Turma turma, Sala sala) {
	this.turma = turma;
	this.sala = sala;
}

}

public class Sala {

/**
 * @param args
 */
int bloco;
int sala;
int capacidade;
boolean acessivel;

public Sala() {
    super();
}

/**
 * @param bloco
 * @param sala
 * @param capacidade
 * @param acessivel
 */
public Sala(int bloco, int sala, int capacidade, boolean acessivel) {
    super();
    this.bloco = bloco;
    this.sala = sala;
    this.capacidade = capacidade;
    this.acessivel = acessivel;

}

String getDescricao() {
    return "Bloco " + this.bloco + ", Sala " + this.sala + " (" + this.capacidade + " lugares, "
            + (this.acessivel ? "acessível" : "não acessível") + ")";

}

}

public class Turma {

String nome;
String professor;
int numAlunos;
boolean acessivel;
String[][] turma = { 
		{"segunda ","terça ","quarta ","quinta ","sexta "},
		{"8hs","10hs","12hs","14hs","16hs","18hs","20hs"}
};

ArrayList<Integer> horarios = new ArrayList<Integer>();

public Turma() {
	super();
}

/**
 * @param nome
 * @param professor
 * @param numAlunos
 * @param acessivel
 */
public Turma(String nome, String professor, int numAlunos, boolean acessivel) {
	this.nome = nome;
	this.professor = professor;
	this.numAlunos = numAlunos;
	this.acessivel = acessivel;
}

void addHorario(int i) {
 
	 horarios.add(i);
}

String getHorariosString() {
 	
	String retorno= "";
	int i;
	
	Iterator<Integer> horario = horarios.iterator();
	
	while(horario.hasNext()){
		
		i= horario.next().intValue();
		retorno += turma[0][i/7]+turma[1][(i%7)-1];
		

		if(horario.hasNext()){
			retorno+=", ";
		}
	}
	
	return retorno;
}

String getDescricao() {
    return "Turma: " + this.nome + "\nProfessor: " + this.professor + "\nNúmero de Alunos: " 
    		+ this.numAlunos + "\nHorário: " + getHorariosString() + "\nAcessível: "
            + (this.acessivel ? "sim" : "não");
}

}

Acho que assim fica melhor de identificar onde está meu erro…:sweat_smile:

Adiciona o código abaixo na classe TurmaEmSala e testa, não tenho como rodar aqui.

@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((turma == null) ? 0 : turma.hashCode()); return result; }

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	TurmaEmSala other = (TurmaEmSala) obj;
	if (turma == null) {
		if (other.turma != null)
			return false;
	} else if (!turma.equals(other.turma))
		return false;
	return true;
}

Assim?

public class TurmaEmSala {

Turma turma;
Sala sala;

public TurmaEmSala() {
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((turma == null) ? 0 : turma.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	TurmaEmSala other = (TurmaEmSala) obj;
	if (turma == null) {
		if (other.turma != null)
			return false;
	} else if (!turma.equals(other.turma))
		return false;
	return true;
}
/**
 * @param turma
 * @param sala
 */
public TurmaEmSala(Turma turma, Sala sala) {
	this.turma = turma;
	this.sala = sala;
}

}

Continua da mesma forma…

É bom deixar eles sempre no final da classe ou depois dos construtores pra não atrapalhar a leitura da tua classe. Mas testa ai e me diz se funcionou.

Se não funcionar me manda tua classe que ta executando o Main pra eu testar aqui antes de postar uma nova resposta.

Beleza, já coloquei no fim da classe, mas ainda está da mesma forma…

Vou enviar a main…

public class EnsalamentoMain {

/**
 * @param args
 */
public static void main(String[] args) {
	
	Sala um = new Sala();
	um.bloco=6;
	um.sala=101;
	um.capacidade=70;
	um.acessivel=false;
	
	Sala dois = new Sala();
	dois.bloco=6;
	dois.sala=102;
	dois.capacidade=60;
	dois.acessivel=false;
	
	Sala tres = new Sala();
	tres.bloco=6;
	tres.sala=201;
	tres.capacidade=70;
	tres.acessivel=true;
		
	Turma aed1 = new Turma();
	aed1.nome = "Algoritmos e Estrutura de Dados I";
	aed1.professor = "Edleno Silva";
	aed1.numAlunos = 60;
	aed1.acessivel=false;
	aed1.addHorario(2);
	aed1.addHorario(16);
	aed1.addHorario(30);
	
	Turma tp = new Turma();
	tp.nome = "Técnicas de Programação";
	tp.professor = "Horácio Fernandes";
	tp.numAlunos = 50;
	tp.acessivel=true;
	tp.addHorario(11);
	tp.addHorario(25);
	tp.addHorario(32);
	
	Turma lpc = new Turma();
	lpc.nome = "Laboratório de Programação C";
	lpc.professor = "Edson Nascimento";
	lpc.numAlunos = 10;
	lpc.acessivel=true;
	lpc.addHorario(1);
	lpc.addHorario(15);
	lpc.addHorario(29);
		
	Turma rc = new Turma();
	rc.nome = "Redes de Computadores";
	rc.professor = "Edjair Souza";
	rc.numAlunos = 70;
	rc.acessivel=true;
	rc.addHorario(2);
	rc.addHorario(16);
	
	//System.out.println(aed1.getDescricao()+"\n\n"+tp.getDescricao()+"\n\n"+lpc.getDescricao()+"\n\n"+rc.getDescricao());
	
	Ensalamento en = new Ensalamento();
	en.addSala(um);
	en.addTurma(lpc);
	en.addSala(dois);
	en.addTurma(tp);
	en.addSala(tres);
	en.addTurma(aed1);
	en.alocar(lpc, tres);
	en.alocar(aed1, um);
	en.alocar(lpc, tres);
	en.alocar(lpc, tres);
	en.alocar(aed1, um);
	
	
	System.out.println (en.getTotalTurmasAlocadas());

}	

}

coloquei o getTotalTurmasAlocadas() retornando o tamanho do arraylist pra ver se ele estava add todos, até mesmo os repetidos…

Man no teu MAIN vc não passa nenhuma lista TurmaEmSala pro objeto en, logo quando vc executar o método alocar a collection ensolamento lá dentro vai estar NULL então vai sempre executar.

Pra funcionar dessa maneira que vc fez sua classe teste, você deve trocar ensolamento por turmas.

`boolean alocar(Turma turma, Sala sala) {
TurmaEmSala enSala = new TurmaEmSala();

	if(!turmas.contains(turma)){			
		if(turma.numAlunos > sala.capacidade){
			return false;
		}else if(turma.acessivel == sala.acessivel){
			ensalamento.add(enSala);
			return true;
		}		
	}
	
return false;
}`