Problemas com equals, comparando object e array

8 respostas
programaçãojava
L

tenho um problema no meu codigo, que é um sistema de cadastro de eventos, no qual ele deveria comparar dois objetos do tipo da classe Tempo, na qual se já tem um evento com tempo igual, ele retorna false na hora de adicoionar, porém mesmo com varios tempos igais ele continua adicionando, pra ele todos os codigos são diferentes:

public class Tempo implements Serializable {

int dia , mes , ano ;
int horaInicio , horaFim , minInicio , minFim ;

//coisas a mais…
}

public class Evento {

public String nome;

String descricao;

String local;

Tempo tempo;

public Evento() {

}

public class Agenda {

public ArrayList<Evento> agenda ;

public boolean adicionar(Evento e) {

int x = 0;
Tempo q = e.getTempo();

for(int i=0;i<agenda.size();i++) {
	
	Tempo ver = agenda.get(i).getTempo();
//Deveria das iguais, mas não
	if(q.equals(ver)) {
System.out.println(o periodo de tempo pedido nao esta vazio);

x++;

//Pra ele, tosos os tempos são diferentes de agenda

}

}
if(x == 0) {
	System.out.println("aqui tem uma vaga ");	
	return agenda.add(e);
}else {
	return false;
}

}

Tdos as vezes de comparação ele dá diferente, o que pode ser?

8 Respostas

staroski

Você sobrescreveu os métodos hashcode e equals da classe Tempo?

L

Como assim metodos? Eles não só são comandos?

FearX

Não existe isso de “comandos”. São métodos.

L

Peraí, eu dei uma olhada, entendi que é necessário sobrescrever o equals nestes casos, mas como eu faço isso, especialmente nesse programa? Nunca trabalhei com isso antes

adriano_si

Segue código de exemplo para você validar e tirar suas dúvidas:

public class Tempo {

int dia , mes , ano ;
int horaInicio , horaFim , minInicio , minFim ;

// coisas a mais...


// O método hashCode é de extrema importância para collections  que esse método será
// o responsável por definir os padrões de agrupamento de seus objetos para facilitar
// buscas em collections.  algumas explicações bem detalhadas na net e refazê-las aqui
// seria perda de tempo. Segue exemplo: https://blog.caelum.com.br/ensinando-que-e-o-hashcode/
@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ano;
	result = prime * result + dia;
	result = prime * result + horaFim;
	result = prime * result + horaInicio;
	result = prime * result + mes;
	result = prime * result + minFim;
	result = prime * result + minInicio;
	return result;
}

// O critério de igualdade deve ser feito com base na sua regra, se apenas 2 campos iguais
// forem suficientes pra você dizer que um objeto é igual ao outro, você deve deixar somente 
// os 2 IFs que comparam esses campos, deixei de todos pra você ver o exemplo completo.
@Override
public boolean equals(Object obj) {
	if (this == obj) // Aqui os objetos são exatamente os mesmos, para de testar
		return true;
	if (obj == null) // Aqui não tem objeto pra testar igualdade
		return false;
	if (getClass() != obj.getClass()) // Objetos de classes diferentes sempre serão diferentes
		return false;
	Tempo other = (Tempo) obj;
	if (ano != other.ano)
		return false;
	if (dia != other.dia)
		return false;
	if (horaFim != other.horaFim)
		return false;
	if (horaInicio != other.horaInicio)
		return false;
	if (mes != other.mes)
		return false;
	if (minFim != other.minFim)
		return false;
	if (minInicio != other.minInicio)
		return false;
	return true;
}

}

Que fique claro que eu usei o gerador padrão do Eclipse para ambos os métodos.

L

Eu estou seguindo esse padrão: Tempo, Evento, Agenda.

Tempo é um atriubuto de Evento(pois um Evento posssui um Tempo a ser realizado), e Agenda é um arrayList de Evento. poque nunca usei antes hashcode,

staroski

Comandos são programas que você executa diretamente da linha de comando de seu sistema operacional. Alguns comandos que o JDK disponibiliza são: java, javac, javadoc, jar.

Métodos são operações executadas por um objeto (métodos de instância ou métodos não estáticos) ou por uma classe (métodos de classe ou métodos estáticos).

Depende, qual o critério para dizer que um objeto da classe Tempo é igual à outro?

Há alguns anos eu disponibilizei um material ensinando a implementar os métodos hashcode e equals, inclusive utilizando o padrão de projeto strategy, dê uma lida, pode lhe ser útil.

L

Oi pessoas, desculpe a demora, é que essa semana foi corrida, sim , o que vocês postaram foi bem útil, apesar de eu não ter entendido direito sobre como sobrescrever o método equals, mas graças ao colega que revisou meu código pude terminar meu código, e está funcionando como esperado. Quando voltar a ter tempo livre, vou dar uma olhada sobre isso .Muito obrigado a todos

PS: fiquem a vontade se quiserem falar mais sobre como sobrescrever o metodo equals logo abaixo… :wink:

Criado 21 de abril de 2019
Ultima resposta 28 de abr. de 2019
Respostas 8
Participantes 4