Sobrescrita do Método equals() e hashCode(); Ajudaaa!

7 respostas
M

olá pessoal, eu tenho um probleminha, tenho que fazer um cadastro de várias obras e guardálas em um ArrayList de objetos. Até ai blz sem problemas, mas eu não posso cadastrar obras que tenham o mesmo nome ou o mesmo código. Para isso precisarei sobrescrever o método equals e por consequencia o hashCode, alguem pode me ajudar neste ponto?
Não sei como sobrescrever esses caras. Segue o codigo de minha superclasse abaixo:

import java.util.ArrayList;

abstract class Obra implements Custos, Comparable {

private String nome;
private String endereco;
private int codigo;

//abstract Obra obraMaisCara();

public Obra(String nome) {
	setNome(nome);
}

//Função para comparar o custo da obra, e tbm para usarmos o sort de collections
public int compareTo(Obra o) {

	Obra obras = (Obra) o;

	if (getCustoTotal() == obras.getCustoTotal()) {
		    return getNome().compareToIgnoreCase(obras.getNome());
	
	   } else if (getCustoTotal() < obras.getCustoTotal())
		   return 1;
	
	return -1;

}

@Override
public String toString() {

	 return "O nome e: " + getNome()+"\n";
}
	



@

@Override
public boolean equals(Object obj) {
	Obra tmp = (Obra) obj;
	if(tmp.getCodigo() == getCodigo() || tmp.getNome() == getNome()){
		return true;}
	
	return false;
}



// Classe para retornar as obas acima de:  R$ 500.000,00
public static ArrayList<Obra> obrasAcimaQuinhentos(ArrayList<Obra> obras){
    ArrayList<Obra> obraAcimaQuinhentos = new ArrayList<Obra>(); // Instancia um novo Array contendo as obras acima de 500.000,00
	System.out.println("As obras acima de R$: 500.000,00 sao: \n");
	for (int i = 0; i < obras.size(); i++) {
		if (obras.get(i).getCustoTotal() > 500.000) {
			obraAcimaQuinhentos.add(obras.get(i));
		}
	}
	return obraAcimaQuinhentos;
}


// Classe para retornar a oba mais cara
public static Obra obrasMaisCara(ArrayList<Obra> obras){
	  double maisCaro = 0.0;	
	  int position=0;
	  for (int i = 0; i < obras.size(); i++) {
			if(obras.get(i).getCustoTotal() > maisCaro){
				maisCaro = obras.get(i).getCustoTotal();
				position = i;
	    		}
			
			}
		
	      return obras.get(position); // Retorna o objeto que contém a obra mais cara, assim posso trabalhar com seus dados como quiser.
		//return position; // Retorna a posição do objeto que contém a obra mais cara, assim posso maninupul-lo como quiser.
	}

public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getEndereco() {
	return endereco;
}
public void setEndereco(String endereco) {
	this.endereco = endereco;
}
public int getCodigo() {
	return codigo;
}
public void setCodigo(int codigo) {
	this.codigo = codigo;
}

}

7 Respostas

Rodrigo_Sasaki

não entendi muito bem sua dúvida…

você quer ajuda pra reescrever o hashCode(), é isso?

não sei se você gosta de coisas automáticas mas a algumas IDEs geram ele automaticamente pra você, não sei se isso te ajuda.

M

É isso ai, eu não quero usar o pronto do Eclipse por exemplo. Eu quero sobrescrever ele mas não estou entendendo a lógica, eu preciso garantir que não tenha cadastro de duas obras com mesmo código ou com mesmo nome, e para isso preciso sobrescrever o método equals, e como toda vez que sobrescrever ele é uma ótima pratica sobrecrever o hashcode, preciso sobrescrevê-los para que não tenha objetos com mesmo nome ou mesmo código. entende…

Att,

fuadksd

vc tem que fazer alguma operação com atributos do objeto que possam ser utilizados pra identificá-lo. pra isso vc pode usar o hashCode() das String fazer alguma operação de bit com seu codigo.

E

Eu recomendaria você estudar o que o Eclipse lhe criou. Não é tão difícil de entender, se você for paciente.

joaoorso

O que que custa colocar o código entre as tags [code] ?

igor_ks

pq nao usa HashSet (ou alguma classe q implementa set) ao inves de ArrayList?
Collections Set nao permitem repeticao

fabim

Ajudandooooooooooooooooooooooooooooooo!!! (viu como é chato qdo alguem grita? rsrs)

Passei o olho rapido pelo seu codigo e chutaria que seu problema está aqui:

tmp.getNome() == getNome()

Nao se compara Strings dessa maneira em Java. Utilize o proprio string.equals() ou string.equalsIgnoreCase();

Acertando a subscricao do equlals, adicione seus objetos numa Collection que implement Set (Evitam duplicatas baseado no seu equals).
Se precisar que sejam ordenados de acordo com a inserção, utilize LinkedHashSet.

Criado 7 de novembro de 2011
Ultima resposta 9 de nov. de 2011
Respostas 7
Participantes 7