How to override equals for it to compare: primitive objects and keys (int, String, double)

Asked

Viewed 170 times

1

Is there any way to compare? because in my code, if it is not int or Object the program throws an exception. To be able to use in the method contains the Listsequential class.

Classe Pessoa

public class Pessoa implements Comparable {

    private String nome;
    private int idade;

    public Pessoa() {
    }

    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

    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 int compareTo(Object o) {
        Pessoa other = (Pessoa) o;

        if (getIdade() < other.getIdade()) {
            return 1;
        } else if (getIdade() > other.getIdade()) {
            return -1;
        } else {
            return 0;
        }
    }

    @Override
    public boolean equals(Object o) {
        // Se o objeto for uma instacia de Pessoa, comparar idades entre os dois objetos; ex.: p1.equals(o);
        if (o instanceof Pessoa) {
            return ((Pessoa) o).idade == this.idade;
            //Se a entrada não for um objeto, e sim um inteiro ou String comparar com um atributo de Pessoa; ex.: idade.
        } else if (o != null) {
            int x = (Integer) o; // O problema está aqui, se não for inteiro, o programa lanca uma Exception,
            return x == this.idade; // Tem alguma forma de contornar isso?
        } else {
            return false;
        }
    }

    @Override
    public String toString() {
        return "Pessoa{" +
                "nome='" + nome + '\'' +
                ", idade=" + idade +
                '}';
    }
}

class Listsequential:

import java.util.Arrays;

public class ListaSequencialNaoOrdenada implements ILista {

    public Object[] lista;
    public int tamanhoLista;
    public int qtdElementosArmazenados;
    boolean listaInicializada;

    //Vetor extensível.
    public void inicializar(int quantidadeMaxima) {
        lista = new Object[quantidadeMaxima];
        tamanhoLista = quantidadeMaxima;
        qtdElementosArmazenados = 0;
        listaInicializada = true;
    }

    public void adicionar(Comparable o) throws ListaException {
        /**
         * Adicionar em uma posição desejada:
         * for (int i = posElemArmazenado-1; i>=posDesejada; i--){
         *  lista[i+1]=lista[i]
         * lista[r] = e;
         * posElemArmazenado++;
         * }
         */

        if (qtdElementosArmazenados < tamanhoLista) {
            lista[qtdElementosArmazenados] = o;
            qtdElementosArmazenados++;
        } else if (!listaInicializada) {
            throw new ListaException("Lista não inicializada !");
        } else if (qtdElementosArmazenados >= tamanhoLista) {
            throw new ListaException("Lista cheia !");
        }
    }

    public void remover(Object chave) throws ListaException {
        //??? remover um objeto chave ???
        //?remover de uma posicao?
        for (int i = 0; i < qtdElementosArmazenados; i++) {
            if (lista[i].equals(chave)) {
                int pos = i;
                for (int j = pos; j < qtdElementosArmazenados - 1; j++) {
                    lista[j] = lista[j + 1];
                }
                qtdElementosArmazenados--;
            }
        }
    }

    //Como a chave é um objeto, devo utilizar o equals ?!
    //Duvidas nessa parte \/
    public boolean contem(Object chave) throws ListaException {
        if (listaInicializada) {
            for (int i = 0; i < qtdElementosArmazenados; i++) {
                if (lista[i].equals(chave)) {
                    return true;
                }
            }
        } else {
            throw new ListaException("Lista nao inicializada !");
        }
        return false;
    }


    public void expandirLista(float percentual) throws IndexOutOfBoundsException {
        //Criar um novo vetor com o novo tamanho, e passar os elementos do anterior para esse.
        //Casos de adidionar um elemento em um indice especificado.

        /*if (qtdElementosArmazenados == tamanhoLista) {*/
        tamanhoLista = ((tamanhoLista * (int) percentual) / 100) + tamanhoLista;
        Object[] listaAuxiliar = new Object[tamanhoLista];
        for (int i = 0; i < qtdElementosArmazenados; i++) {
            listaAuxiliar[i] = lista[i];
        }
        lista = listaAuxiliar;
        /*}*/
    }

    @Override
    public String toString() {
        return "ListaSequencialNaoOrdenada{" +
                "lista=" + Arrays.toString(lista) +
                ", tamanhoLista=" + tamanhoLista +
                ", qtdElementosArmazenados=" + qtdElementosArmazenados +
                ", listaInicializada=" + listaInicializada +
                '}';
    }
}

Main class for testing:

public class Main {
public static void main(String[] args) throws ListaException {
    Pessoa p1 = new Pessoa("lucas",13);
    Pessoa p2 = new Pessoa("jose", 14);

    //System.out.println(p1.compareTo(p2));
    //System.out.println(p2.compareTo(p1));

    ListaSequencialNaoOrdenada lista = new ListaSequencialNaoOrdenada();
    lista.inicializar(10);
    //System.out.println(lista);
    lista.adicionar(p1);
    lista.adicionar(p2);
    System.out.println("===============================");
    System.out.println(lista.contem("123123"));
    lista.expandirLista(10);
    //System.out.println(lista);
    lista.expandirLista(10);
    //System.out.println(lista);

    //System.out.println(lista.contem(p1));
    lista.remover(p1);
   // System.out.println(lista);

}

}

  • 1

    Avoid displaying your code through images

  • 1

    Sorry @Articuno, I didn’t know how to format the text, there’s my code

  • Which test code are you using and which generate the exception ? As an aside, this would look much better using generics

  • @Isac could pass an intuitive tutorial on Generic?: I did not understand very well this form of implementation.

1 answer

0

Solved

  @Override
public boolean equals(Object o) {
    if (o instanceof Pessoa) {
        return ((Pessoa) o).idade == this.idade;
    } else if (o != null) {
        //Parse no valor inteiro para Integer
        return new Integer(this.idade).equals(o);
    } else {
        return false;
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.