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

8 respostas
I
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:

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;
		
	}
}

e aqui está o main:

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;
}

}

8 Respostas

ViniGodoy

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); }

I

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...

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;
	}
		
		
	}

}
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.
ViniGodoy

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:
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
    }
}
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:
//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);
}

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

I

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.

ViniGodoy

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

ViniGodoy

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); }

I

Eu usei o == e funcionou aqui.

ViniGodoy
Mas não vai funcionar sempre. == compara se dois objetos são o mesmo objeto, equals compara se tem o mesmo valor, veja:
String a = "oi";
String b = new String("oi");

System.out.println(a == b); //false
System.out.println(a.equals(b)); //true
Criado 29 de dezembro de 2012
Ultima resposta 1 de jan. de 2013
Respostas 8
Participantes 2