6
respostas

Resultado dos HashSet

Não entendi, se tem 3 contas e 2 são diferentes. Não entendi porque o meu resultado deu 1.

6 respostas

Oi Jessica.

Pode ser mais específica com a sua dúvida? Se puder postar o exercício aqui também...

O resultado da questão é:

public class TestaHashSetDeConta {

            public static void main(String[] args) {
                HashSet<Conta> contas = new HashSet<Conta>();

                ContaCorrente c1 = new ContaCorrente(123, "Mauricio");
                ContaCorrente c2 = new ContaCorrente(123, "Adriano");
                ContaCorrente c3 = new ContaCorrente(444, "Luiz");

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

                System.out.println("Total de contas no HashSet: " + contas.size());
            }

Porém, não entendi porque o retorno é 1.

Oi Jessica.

O HashSet<>, diferentemente do ArrayList<>, não permite elementos duplicados na lista. Entretanto, no caso dos seus objetos c1, c2 e c3, eles são objetos diferentes, logo se todos forem adicionados ao HashSet<>, o tamanho do mesmo deve ser 3. Veja queas suas referências são distintas, apontam para objetos diferentes.

A referencia compara o nome do cliente, ou seja, o resultado está dando incorreto. Classe conta.

public class Conta implements Comparable<Conta> {
    protected int numero;
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + numero;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Conta other = (Conta) obj;
        if (numero != other.numero)
            return false;
        return true;
    }

    private String nomeDoCliente;

    public void setNumero(int numero) {
        this.numero = numero;
    }

    public int getNumero() {
        return numero;
    }

    public int compareTo(Conta outra) {
      //  return this.getNumero() - outra.getNumero();
        return this.nomeDoCliente.compareTo(outra.nomeDoCliente);
    }

    public String getNomeDoCliente() {
        return nomeDoCliente;
    }

    public void setNomeDoCliente(String nomeDoCliente) {
        this.nomeDoCliente = nomeDoCliente;
    }




}

Olhando o seu @Override no método hashCode() notamos o motivo dos dois primeiros objetos serem considerados iguais, pois ele retorna o mesmo inteiro, uma vez que usa a variável número e nesses dois objetos essa variável tem o mesmo valor. Agora, o terceiro objeto não faz sentido ser considerado igual. Esse resultado deveria ser 2. Ou tem mais algo no seu código, ou estamos comendo bola...

O unico código que falta seria o da conta corrente. É esse.


public class ContaCorrente extends Conta {

    private double saldo;
    private String nome;
    private int numeroDaConta;

    public ContaCorrente (int numero,String nome ){
     this.numeroDaConta = numero;
     this.nome = nome;
    }

    public void deposita(double d) {
        setSaldo(getSaldo() + d);
    }

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
}