Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Estou em dúvida sobre método contains

Boa noite, fiz um projeto para testar as implementações do método contains e equals, segue abaixo a classe main:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import br.com.petlove.cachorros.Cachorro;
import br.com.petlove.donos.ProprietarioDoCachorro;

public class Teste {
public static void main(String[] args) {

    Cachorro c1 = new Cachorro("Apolo", 2, 24.5);
    Cachorro c2 = new Cachorro("Lulu", 3, 20.0);
    Cachorro c3 = new Cachorro("Apolo", 10, 50.3);
    Cachorro c4 = new Cachorro("Lessi", 12, 34.6);

    ArrayList<Cachorro> listaCachorro = new ArrayList<Cachorro>();

    listaCachorro.add(c1);
    listaCachorro.add(c2);
    listaCachorro.add(c3);
    listaCachorro.add(c4);


    listaCachorro.contains(c2);

Aqui a classe onde sobrescrevi equals:

package br.com.petlove.cachorros;

public class Cachorro extends Object {

private String nome;
private int idade;
private double peso;

public Cachorro(String nome, int idade, double peso) {
    this.nome = nome;
    this.idade = idade;
    this.peso = peso;

}

public String getNome() {
    return nome;
}

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

public int getIdade() {
    return idade;
}

public void setIdade(int idade) {
    this.idade = idade;
}

public double getPeso() {
    return peso;
}

public void setPeso(double peso) {
    this.peso = peso;
}

@Override
public boolean equals(Object ref) {

    Cachorro comparacao = (Cachorro) ref;

    if (this.nome == comparacao.getNome()) {
        System.out.println("Tem um cachorro com esse nome");
        return false;
    }
    System.out.println("Não tem nenhum cachorro com esse nome");
    return false;
}
}

A minha dúvida é a seguinte, agora a implementação do equals faz certinho a verificação de nome dos cachorros, mas antes eu tinha feito uma outra implementação do metodo equals desta forma:

 @Override
 public boolean equals(Object ref) {
    Cachorro comparacao = (Cachorro) ref;
    if(this.nome != comparacao.getNome()) {
        System.out.println("Não tem nenhum cachorro com esse nome");
        return true;
    }else {
        System.out.println("Tem um cachorro com esse nome");
        return false;
    }
}

Como pode ser verificado o primeiro código retorna FALSE nas duas saídas do método equals, equanto esse segundo método além de ter um ELSE retorna TRUE no IF. Percebi também que se eu mudar o return da primeira implementação do equals para TRUE em qualquer uma dos returns ele só faz o laço 1 vez ou 2 vezes no máximo se eu colocar return TRUE no IF. Gostaria de uma explicação de alguém mais experiente do porque disso acontecer, fiquei bem confuso kkk.

3 respostas
solução!

Boa noite, Diego.

Começaremos explicando a diferença entre o contains e o equals.

O contains verificará se dentro daquela lista, tem o objeto passado como paramento no método, que no seu caso é o c2, retornando true se tiver ou false se não tiver.

Já o equals, estará verificando se nossa métrica de comparação usada no método equals está certo. Usaremos esse exemplo aqui:

 @Override
 public boolean equals(Object ref) {
    Cachorro comparacao = (Cachorro) ref;
    if(this.nome != comparacao.getNome()) {
        System.out.println("Os cachorros não tem os mesmos nomes");
        return false;
    }else {
        System.out.println("UAU!! Os dois cachorros tem os mesmos nomes!");
        return true;
    }
}

Veja que a nossa métrica de comparação é o nome, então não importa se eles têm a mesma idade ou peso. Então assim podemos verificar se eles são “iguais” ou não.

Exemplo de uso:

# imports

public class Teste {
public static void main(String[] args) {

    Cachorro c1 = new Cachorro("Apolo", 2, 24.5);
    Cachorro c2 = new Cachorro("Lulu", 3, 20.0);
    Cachorro c4 = new Cachorro("Lessi", 12, 34.6);

    ArrayList<Cachorro> listaCachorro = new ArrayList<Cachorro>();

    listaCachorro.add(c1);
    listaCachorro.add(c2);
    listaCachorro.add(c3);


    System.out.println(listaCachorro.contains(c2));
    System.out.println(c1.equals(c3));

Retorno:

>>> True
>>> False

Lembrando que você pode usar mais métricas para verificar se eles são iguais. Dessa forma:

 @Override
 public boolean equals(Object ref) {
    Cachorro comparacao = (Cachorro) ref;
    if(this.nome != comparacao.getNome() || this.idade != comparacao.getIdade()) {
        System.out.println("Os cachorros não tem os mesmos nomes");
        return false;
    }else {
        System.out.println("UAU!! Os dois cachorros tem os mesmos nomes!");
        return true;
    }
}

Assim estaremos verificando se o nome é a idade dos cães são iguais.

Espero ter te ajudo, um grande ABRAÇO!

Ainda está com a dúvida Diego?

Muito obrigado pela resposta, me ajudou a chegar em um entendimento melhor. Desde já agradeço,.