Como criar o método public boolean equals(final Pais outro)?

Olá pessoal, encontrei uma dificuldade durante a solução de um problema… O problema pede para fazer um método com essa assinatura: public boolean equals(final Pais outro). Este método deve comparar dois objetos (Países) e dizer se são iguais ou não. Dois países são iguais se tiverem a mesma capital e o mesmo nome. O problema é que eu não entendi esse parâmetro. Alguém pode me ajudar a começar a construir esse método?

Aqui está a classe Pais:

[code]public class Pais {
private String nome, capital;
private double dimensao_km2;
private int[] fronteira;

public Pais(String n,String c,double d){
	nome = n;
	capital = c;
	dimensao_km2 = d;
	
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public String getCapital() {
	return capital;
}

public void setCapital(String capital) {
	this.capital = capital;
}

public double getDimensao_km2() {
	return dimensao_km2;
}

public void setDimensao_km2(double dimensao_km2) {
	this.dimensao_km2 = dimensao_km2;
}

public int[] getFronteira() {
	return fronteira;
}

public void setFronteira(int[] fronteira) {
	this.fronteira = fronteira;
}

public boolean equals(final Pais outro){
	
	return false;
	
}

}
[/code]

e aqui está o main:

[code]public class PaisMain {

public static void main(String[] args) {
	Pais objeto1 = new Pais("brasil", "brasilia", 500.000);
	Pais objeto2 = new Pais("argentina", "buenos aires", 200.000);
	Pais objeto3 = new Pais("EUA", "washington", 800.000);

}

public boolean equals(final Pais outro){

return false;

}

}[/code]

Oi. Você inverteu a tag code. Ela começa com a tag sem a / e termina com a barra.

Você tem que dizer se dois países são iguais e, como parâmetro, você recebe outro país para fazer a comparação. Logo:

public boolean equals(final Pais outro){ //Retorna true se for o mesmo nome e capital, false caso contrário return nome.equals(outro.nome) && capital.equals(outro.capital); }

Essa não é a assinatura padrão do método equals do Java, o que criará uma sobrecarga. Se fosse o método equals mesmo, teria que ser:

@Override public boolean equals(Object obj){ if (!obj.getClass() == getClass()) return false; if (obj == this) return true; Pais outro = (Pais)obj; return nome.equals(outro.nome) && capital.equals(outro.capital); }

ViniGodoy, obrigado pela dica da tag code. Sou novato, não sabia da ordem. Mas eu não entendi os seus métodos. Acho q tem bastante conhecimento, q me falta agora, para eu entender o que está nos “ifs”. Mas deixa eu ir pro começo…

[code]public class PaisMain {

public static void main(String[] args) {
	Pais objeto1 = new Pais("brasil", "brasilia", 500.000);
	Pais objeto2 = new Pais("argentina", "buenos aires", 200.000);
	Pais objeto3 = new Pais("EUA", "washington", 800.000);

}

public boolean equals(Pais objeto1){
if((objeto1.getNome() == objeto2.getNome())&&(objeto1.getCapital() == bojeto2.getCapital())){
return false;
}

}

}[/code]

Neste código o método equals não está completo e o eclipse aponta erro onde tem “objeto2.getNome()”. Acredito q não está apontando erro no “objeto1.getNome()”, porque eu tenho “objeto1” como parâmetro. Eu quero saber como faço para ter no meu método equals um dos objetos instanciados (cho q é essa a expressão), la em cima, como parâmetro. No caso, um destes:
Pais objeto1 = new Pais("brasil", "brasilia", 500.000); Pais objeto2 = new Pais("argentina", "buenos aires", 200.000); Pais objeto3 = new Pais("EUA", "washington", 800.000); e depois comparar os atributos “nome” e “capital” desse objeto com os atributos “nome” e “capital” de um segundo objeto (que também seja um desses três q eu já coloquei aí: objeto1, objeto2 ou objeto3). Caso os dois atributos sejam iguais eles serão países iguais, em outro caso, serão países diferentes.

O equals está dentro da classe país. E a classe país já representa um objeto, certo?

Então, sua classe país vai comparar “este” país com “outro” país, recebido por parâmetro.

Ou seja, “this” com “outro”.

Veja como o método equals é chamado:

[code]public class PaisMain {
public static void main(String[] args) {
Pais objeto1 = new Pais(“brasil”, “brasilia”, 500.000);
Pais objeto2 = new Pais(“argentina”, “buenos aires”, 200.000);
Pais objeto3 = new Pais(“brasil”, “brasilia”, 500.000);

    //Chama o equals de pais, passando outro país.
    System.out.println(objeto1.equals(objeto2)); //Imprime false
    System.out.println(objeto2.equals(objeto3)); //Imprime false
    System.out.println(objeto1.equals(objeto3)); //Imprime true: nome e capital iguais
}

}[/code]

Note que no equals da classe país, que te passei, você está comparando “this” com o país recebido por parâmetro, “outro”.
Veja como ele poderia ser reescrito, deixando “this” explícito:

[code]
//Esse método fica na classe Pais
@Override
public boolean equals(Object obj){
//Se o obj não é da classe país, não é igual
if (!obj.getClass() == Pais.class) return false;

//Vamos testar se o outro país tem o mesmo nome e capital desse
Pais outro = (Pais)obj;
return this.nome.equals(outro.nome) && this.capital.equals(outro.capital);

} [/code]

Se ainda não entendeu, volte a estudar os conceitos básicos do que é uma classe e o que é um objeto.

Obrigado ViniGodoy, consegui fazer sim o método, colocando numa forma que eu compreendo melhor. Ficou assim:

public boolean equals(final Pais outro){ //Retorna true se for o mesmo nome e capital, false caso contrário if((this.nome == outro.nome) && (this.capital==outro.capital)){ return true; } else{return false;} }

Como não tenho muita experiência em java não entendo bem ainda alguns comandos que você utilizou como: obj.getClass(), Pais.class e (Pais)obj.
Mas o método deu certo, valeu a ajuda.

Você não pode comparar as Strings do nome e da capital com ==. Tem que usar o equals também.

public boolean equals(final Pais outro){ //Retorna true se for o mesmo nome e capital, false caso contrário return this.nome.equals(outro.nome) && this.capital.equals(outro.capital); }

Eu usei o == e funcionou aqui.

Mas não vai funcionar sempre. == compara se dois objetos são o mesmo objeto, equals compara se tem o mesmo valor, veja:

[code]
String a = “oi”;
String b = new String(“oi”);

System.out.println(a == b); //false
System.out.println(a.equals(b)); //true[/code]