Verificar se um objeto contem no array[RESOLVIDO]

Boa noite, iniciante em java, tentando ler, entender e resolver a apostila da caelum.

(Opcional) Crie um método para vericar se um determinado Funcionario se encontra ou não como
funcionário desta empresa:

class Empresa {
String nome;
String cnpj;
Funcionario empregados[];

void adiciona(Funcionario f){
	for (int i = 0; i < this.empregados.length; i++){
		if (empregados[i] == null){
			this.empregados[i] = f;
			System.out.println("Funcionario adicionado");
			break;
		}
	}
}

void mostraEmpregados(){
	for (int i = 0; i < this.empregados.length; i++) {
		if(empregados[i] != null){
			System.out.println("Funcionario na posição: " + i);
			System.out.println("O funcionario: " +this.empregados[i].nomeFuncionario+
			" Recebe: " +this.empregados[i].salario);
		}
	}
}

boolean contem(Funcionario f) {
	for (int i = 0; i < this.empregados.length; i++) {
		if(empregados[i].equals f){
			return true;
		}
		return false;
	}
}			

}

Como fazer esse método contem???

Em Java, sempre que você chama um método, os argumentos devem ser fornecidos entre parênteses:

empregados[i].equals(f)

O seu raciocínio está correto, mas você deve atentar-se para alguns detalhes:

  • você só pode concluir que o funcionário não está na lista (retornar false) após percorrer todo o array, observe melhor o seu código e você vai entender

  • tome cuidado com referências nulas. Se o seu loop acessar uma posição do array com null seu código vai disparar uma NullPointerException

  • lembre-se de sobrescrever o método equals() da classe Funcionario

2 curtidas

Só complementando a resposta do @rmendes08

*tome cuidado com referências nulas. Se o seu loop acessar uma posição do array com null seu código vai disparar uma NullPointerException

de uma estudada em for-each, e da uma analisada no contexto do seu método, as vezes pode ser útil e vc não precisará se incomodar com o NullPointer :smiley:

A menos que funcionário seja uma entidade, o que é mais provável. Neste caso o correto seria:
if (empregados[i].identidade.equals(f.identidade)) {
return true
}

@rmendes08
Entendi.
Consegui corrigir, no caso do contem TRUE beleza, mas no caso de FALSE, problema com o NullPointer que o @murilo_galvao citou!!!

@murilo_galvao
Tentei mudar todos os For que precisava percorrer o array para FOR-EACH, mas não tive muito sucesso, se o meu array fosse do tipo int acho que teria dado certo, mas como é do tipo Funcionario, não sei muito bem como fazer.

@pfk66
Neste caso, eu compararia um atributo!? Tipo uma PK, RG, isso?

Pessoal fui tentando e tentando e ficou assim… Quando TRUE beleza, mas no FALSE da NullPointer

boolean contem(Funcionario f) {
	for (Funcionario i : empregados) {
		if(i.equals(f)){
		System.out.println("Funcionario " +f.nomeFuncionario+ " encontrado!");
		return true;
		}
	}
	System.out.println("Funcionario " +f.nomeFuncionario+ " não encontrado!");
	return false;
}

Isso acontece porque o loop for percorre cada posição do array, mesmo que ela esteja nula. Você precisa de um teste adicional, verificando se a referência i não é nula, e somente então chamar o método equals().

1 curtida

cara, procura verificar o estado do seu “f”, provavelmente na hora que você vc fazendo o sysout no final ali - System.out.println(“Funcionario " +f.nomeFuncionario+ " não encontrado!”); - o f está chegando nulo ali, ai quando vc tenta acessar o nomeFuncionario ai que surge o nullPointer…

1 curtida

@rmendes08 @murilo_galvao
Valeu. Vai ficar +/- como no método adiciona, só imaginei que tivesse outro jeito!
Muito obrigado! Por enquanto é só isso! Quando surgir mais dúvidas eu incomodo mais um pouco!

Isso mesmo. RG, CPF, seja lá o que você usa pra identificar um funcionário no seu sistema.
Equals é para comparar valores, e não entidades (apesar que 99% dos programadores OO não sabem a diferença entre objetos valor e entidades, e acabam misturando tudo no mesmo balaio… :smile: )

Já conseguiu? Eu não li o exercício, mas responderia mais ou menos assim:

class Empresa {
private String nome;
private String cnpj;
private List empregados;

public Empresa () {
	empregados = new ArrayList<Funcionario>();
}

public void adiciona(Funcionario f){
	empregados.add(f);
}

public void mostraEmpregados(){
	for (int i = 0; i < this.empregados.length; i++) {
			System.out.println("Funcionario na posição: " + i);
			System.out.println("O funcionario: " +empregados.get(i).getNomeFuncionario()+
			" Recebe: " +empregados.get(i).getSalario());
	}
}

public boolean contem(Funcionario f) {
	for (Funcionario e : empregados) {
		if(e.equals(f)){
			return true;
		}
	}
	return false;
}

}